**:
前序,中序遍歷,在此就不向大家向下說明了,如有不懂請先理解,再來看此篇文章。
當我們拿到前序和中序時,如何重新構建一顆新的數呢?
首先,大家都知道的,由中序遍歷序列可知,第乙個節點是根節點,
其次,由前序遍歷序列可知,第乙個節點是根節點的左子樹節點,而且前序遍歷中,根節點左邊是左子樹,右邊是右子樹,因此通過中序遍歷的根節點可以確定的是:
根節點在前序遍歷中的位置(通過遍歷前序遍歷序列,比較每乙個節點與中序遍歷中的第乙個節點即根節點可知); 左子樹的節點數,因為一旦找到前序遍歷中根節點的位置,就找到左右子樹的分界點,也就是說,前序遍歷中根節點左邊的都是左子樹節點,可以通過遍歷知道左子樹的節點數; 同樣,右子樹的節點數也可以確定。
我們可以這樣來重新構造它。
假如,我們要構建的樹是這樣的
現在,我們知道它的根節點,和左右節點的個數,正如下圖
然後現在,我們只能重建它的左樹,然後重建它的右樹。依次這樣遞迴下去
void findpost(const vectorprev, const vectorin)
binarytreenode* greattree(const vectorprev, const vectorin)
} for(int i = 0;i < gen; i++) //計算出左節點個數
for(int i = gen+1; i< in.size(); i++ ) //計算右系欸但個數
root->_left = greattree(prev_p,in_p); //依次遞迴下去
root->_right = greattree(prev_e,in_e);
return root;
}
leetcode:10 如何根據前序遍歷序列和中序遍歷序列確定二叉樹
分段,每一段找根節點,就好,找root,有點遞迴的思路。例如 假設某二叉樹的先序遍歷序列是abdgcefh,中序遍歷序列是dgbaechf,畫出二叉樹,並給出其後序遍歷序列.以下面的例題為例進行講 已知一棵二叉樹的先序遍歷序列和中序遍歷序列分別是abdgcefh dgbaechf,求二叉樹及後序遍歷...
根據前序遍歷序列和中序遍歷序列構造二叉樹演算法
乙個前序遍歷序列和乙個中序遍歷序列可以確定一顆唯一的二叉樹。根據前序遍歷的特點,知前序序列 presequence 的首個元素 presequence 0 為二叉樹的根 root 然後在中序序列 insequence 中查詢此根 root 根據中序遍歷特點,知在查詢到的根 root 前邊的序列為根的...
Leetcode 從前序與中序遍歷序列構造二叉樹
根據一棵樹的前序遍歷與中序遍歷構造二叉樹。注意 你可以假設樹中沒有重複的元素。例如,給出 前序遍歷 preorder 3,9,20,15,7 中序遍歷 inorder 9,3,15,20,7 返回如下的二叉樹 3 9 20 15 7 definition for a binary tree node...