JZ7 重建二叉树

JZ7 重建二叉树

方法一:递归做法

前序的第一个结点就是根节点,而后在中序中将根节点的位置找出,根节点的左边是左子树,右边是右子树,而后再带入前序中分析,形成迭代。

复制代码
/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
        if(pre.size() == 0 || vin.size() == 0) return nullptr; //特殊情况和迭代终止条件

        TreeNode *root = new TreeNode(pre[0]);
        for(int i = 0; i < pre.size(); i ++ ){
            if(vin[i] == pre[0]){
                vector<int>leftpre(pre.begin() + 1, pre.begin() + i + 1);
                vector<int>leftvin(vin.begin(), vin.begin() + i);
                root->left = reConstructBinaryTree(leftpre, leftvin);
                vector<int>rightpre(pre.begin() + i + 1, pre.end());
                vector<int>rightvin(vin.begin() + i + 1, vin.end());
                root->right = reConstructBinaryTree(rightpre, rightvin);
                break;
            }
        }
        return root;
    }
};
复制代码
  • 时间复杂度:O(n),即每个结点都遍历一次,其中n为数组长度,即二叉树的节点数,构建每个节点进一次递归,递归中所有的循环加起来一共n次
  • 空间复杂度:辅助数组和迭代栈都是n,递归栈最大深度不超过n,重建的二叉树空间是必要空间,不是辅助空间

方法二:

也可以用类似非递归前序遍历的方式建立二叉树,利用栈辅助进行非递归,然后依次建立节点。

复制代码
/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
        int n = pre.size();
        int m = vin.size();
        if(n == 0 || m == 0) return nullptr;

        stack<TreeNode*> s;
        TreeNode *root = new TreeNode(pre[0]);
        TreeNode *cur = root;

        for(int i = 1, j = 0; i < pre.size(); i ++ ){
            if(vin[j] != cur->val)//pre数组中当前节点是上一个节点的左子树
            {
                cur->left = new TreeNode(pre[i]);
                s.push(cur);
                cur = cur->left;
            }
            else
            {
                j++;
                //当前节点是上一个节点的祖先的右子树
                while(!s.empty() && s.top()->val == vin[j]){
                    cur = s.top();
                    s.pop();
                    j ++ ;
                }
                //当前节点是上一个节点的右子树
                cur ->right = new TreeNode(pre[i]);
                cur = cur->right;
            }
        }
        return root;
    }
};
复制代码

 

posted @   luxiayuai  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示