JZ043:往完全二叉树添加节点

------------恢复内容开始------------

title: 往完全二叉树添加节点


📃 题目描述

题目链接:往完全二叉树添加节点

image-20220511002050650

🔔 解题思路

方法一:空间换时间的思想,采用层次遍历,遍历到第一个可插入 节点的 父节点,证明后续的节点都是可以作为父节点插入数据的,保存在队列中,如图:

image-20220511002319597

节点3就是可插入数据的第一个节点,节点6就是可插入数据的第二个节点;

class CBTInserter {
public:
    CBTInserter(TreeNode* root) : _root(root){
        _addPos.push(root);
        while (!_addPos.empty()) {
            int len = _addPos.size();
            bool last = false;//是否遍历到可插入的 叶子节点的父节点;
            for (int i = 0; i < len; i++) {
                TreeNode *tmp = _addPos.front();
                if (tmp->left !=nullptr) _addPos.push(tmp->left);
                if (tmp->right !=nullptr) _addPos.push(tmp->right);

                //如果左右孩子存在空,证明就是 可插入的 叶子节点的父节点;
                if (tmp->left == nullptr || tmp->right == nullptr) {
                    last = true;
                    break; //跳出循环,后序都是可插入的节点
                }
                _addPos.pop();//弹出不可插入的节点 
            }
            if (last == true) break;
        }
    }
    
    int insert(int v) {
        TreeNode *tmp = new TreeNode(v);
        TreeNode *cur = _addPos.front();
        if (cur->left == nullptr) {            
            cur->left = tmp;
        }
        //如果右边为空的话,证明这个节点已经无效了
        else if (cur->right == nullptr) {
            cur->right = tmp;
            _addPos.pop();
        }
        _addPos.push(tmp);
        return cur->val;
    }
    
    TreeNode* get_root() {
        return _root;
    }
private:
    TreeNode *_root;
    queue<TreeNode*> _addPos;
};

💥 复杂度分析

  • 时间复杂度:o(1);
  • 空间复杂度:O(n);

------------恢复内容结束------------

posted @ 2022-05-11 00:27  D-booker  阅读(78)  评论(0)    收藏  举报