二叉树的遍历

18. 重建二叉树

输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树。

class Solution {
public:
    vector<int> pre,in;//简化传参;
    map<int,int> mp;//hash改进,减少每次都要查找
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        int n = preorder.size();
        if ( n == 0) return NULL;
        for(int i = 0; i )
            mp[inorder[i]] = i;//hash
        pre = preorder;
        in = inorder;
        return build(0,n-1,0,n-1);
    }
    TreeNode* build(int l1,int r1,int l2,int r2){
        if(l1 > r1) return NULL;
        TreeNode* root = new TreeNode(pre[l1]);//注意新建
        int r = mp[pre[l1]];//hash
        int len = r - l2;
        root->left = build(l1+1,l1+len,l2,r-1);
        root->right = build(l1+len+1,r1,r+1,r2);
        return root;
        
    }
};

19. 二叉树的下一个节点

给定一棵二叉树的其中一个节点,请找出中序遍历序列的下一个节点。

class Solution {
public:
    TreeNode* inorderSuccessor(TreeNode* p) {
        //如果有右子树
        if(p->right){
            p = p->right;
            //找到右子树的最左节点
            while(p->left)
                p = p->left;
            return p;
        }
        //没有右子树,则找到最近左子树的父节点;
        while(p->father && p != p->father->left)
            p = p->father;
        return p->father;
    }
};

 

你可能感兴趣的:(二叉树的遍历)