(經典問題)根據兩種遍歷構建二叉樹

2021-10-04 01:58:39 字數 958 閱讀 2050

在劍指offer上刷到的,以前沒有好好地總結資料結構的知識,現在乾脆一併歸一下檔。

利用兩種遍歷就可以確定一顆二叉數的確定形狀,但是已知的遍歷中必須有中序遍歷。

也就是說,前序遍歷+中序遍歷或者後序遍歷+中序遍歷,就能確定樹。因為必須要利用中序遍歷來分割左子樹和右子樹

題意就是給出前序遍歷和中序遍歷,構造樹。

下面是**:

/**

* definition for binary tree

* struct treenode

* };

*/class solution

int h=pre[0];

int i,j;

//先找到根節點在中序遍歷的位置

for(i=0;ival=h;

//找出左子樹的前序和中序遍歷,然後建立左子樹,並且拼接到根節點

vectorp_l,v_l;

for(i=0;ileft=reconstructbinarytree(p_l,v_l);

//同樣的道理建立右子樹,並且拼接到根節點

vectorp_r,v_r;

for(i=len_l+1;iright=reconstructbinarytree(p_r,v_r);

return head;

}};

在利用遞迴解決問題的時候,最讓我頭疼的就是解決一些邊角的問題,比如這個問題中,要考慮假設子樹為空會不會有錯誤,假設子樹只有乙個節點那運算元組的時候會不會越界之類的。

包括在寫二分查詢演算法的時候也是,到底以左指標和右指標什麼樣的關係來結束迴圈。

我現在有了一些比較通用的方法,那就是在問題建模的時候,找到最大的不可分割的子問題。比如這個問題中,節點個數為1是最大不可分割的子問題,所以要特判節點個數為1或者為0的情況。而節點為2或者更多的節點都會被分割成個數為1或0的子問題。

根據兩種二叉樹遍歷方式,求二叉樹方法

如何根據已知兩種遍歷的序列,求原始的二叉樹?並不是已知道任意兩個序列都可以還原二叉樹,只有知道先序中序以及中序和後序兩種型別的遍歷順序才能還原二叉樹。只知道先序和後序是還原不了原始的二叉樹的。1 已知道先序和中序遍歷,還原二叉樹。已知道二叉樹的先序遍歷為abcdefgh,中序遍歷為bdceafhg,...

根據兩種不同遍歷結果重構二叉樹

leetcode原題 題目1 題目2這裡假設給的遍歷都有中序遍歷,我們先根據先序遍歷或後序遍歷找到根結點的值,然後據此可判斷,在中序遍歷的結果向量中,在根節點之前的部分陣列組成它的左子樹,根節點之後組成它的右子數。採用深度遞迴dfs。題1 已知中序和後序遍歷結果 definition for a b...

根據前序遍歷構建二叉樹

如何只有前序遍歷 帶空節點的 建立二叉樹 1.無法直接切割為左右子樹序列 2.在建立樹的過程中,會得到用掉了多少個節點 返回兩個值,建立好樹的根節點,用掉的個數,用乙個類包起來 public class solution9020 build tree rturn value private stat...