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; } };