從中序與后序遍歷序列構造二叉樹
根據一棵樹的中序遍歷與后序遍歷構造二叉樹。
注意:
你可以假設樹中沒有重復的元素。
例如,給出
中序遍歷 inorder = [9,3,15,20,7]
后序遍歷 postorder = [9,15,7,20,3]
返回如下的二叉樹:
3/ \9 20/ \15 7
思路: 根據構造二叉樹的流程,中序遍歷的訪問順序為左-中-右;后序遍歷的方位順序為左-右-中。
后序最后一個節點為根節點,在中序列表中查找根節點值將中序列表分割成左子樹中序列表和右子樹中序列表因為對于同樣的樹中序和后序列表長度相同,所以根據左子樹中序列表和右子樹中序列表的長度將后序列表分割成左子樹后序和右子樹后序對左子樹根節點,右子樹根節點遞歸調用返回根節點TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder)
{int n=inorder.size();if(n>0){TreeNode* root=new TreeNode(postorder[n-1]);vector<int>::iterator it=find(inorder.begin(),inorder.end(),postorder[n-1]);vector<int> il,ir,pl,pr;il.assign(inorder.begin(),it);ir.assign(it+1,inorder.end());int l,r;l=il.size();r=ir.size();//中序后序遍歷長度相等pl.assign(postorder.begin(),postorder.begin()+l);pr.assign(postorder.begin()+l,postorder.end());root->left=buildTree(il,pl);root->right=buildTree(ir,pr);return root;}else return NULL;
}
從前序與中序遍歷序列構造二叉樹
根據一棵樹的前序遍歷與中序遍歷構造二叉樹。
注意:
你可以假設樹中沒有重復的元素。
例如,給出
前序遍歷 preorder = [3,9,20,15,7]
中序遍歷 inorder = [9,3,15,20,7]
返回如下的二叉樹:
3/ \9 20/ \15 7
思路:
和中序后序構造思路基本一致
根據構造二叉樹的流程,前序遍歷的訪問順序為中-左-右,中序遍歷的訪問順序為左-中-右。
前序第一一個節點為根節點,在中序列表中查找根節點值將中序列表分割成左子樹中序列表和右子樹中序列表因為對于同樣的樹中序和前序列表長度相同,所以根據左子樹中序列表和右子樹中序列表的長度將前序列表分割成左子樹前序和右子樹前序對左子樹根節點,右子樹根節點遞歸調用返回根節點TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder)
{int n=preorder.size();if(n>0){TreeNode* root=new TreeNode(preorder[0]);vector<int>::iterator it=find(inorder.begin(),inorder.end(),preorder[0]);vector<int> il,ir,pl,pr;il.assign(inorder.begin(),it);ir.assign(it+1,inorder.end());int l,r;l=il.size();r=ir.size();//中序前序遍歷長度相等pl.assign(preorder.begin()+1,preorder.begin()+l+1);pr.assign(preorder.begin()+l+1,preorder.end());root->left=buildTree(pl,il);root->right=buildTree(pr,ir);return root;}else return NULL;
}
轉載于:https://www.cnblogs.com/wendyy/p/9332633.html
總結
以上是生活随笔為你收集整理的[leetcode]从中序与后序/前序遍历序列构造二叉树的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。