LintCode 前序遍歷和中序遍歷樹構造二叉樹

2021-08-06 07:09:01 字數 1490 閱讀 9712

根據前序遍歷和中序遍歷樹構造二叉樹.

注意事項

你可以假設樹中不存在相同數值的節點

樣例給出中序遍歷:[1,2,3]和前序遍歷:[2,1,3]. 返回如下的樹:

2 / \13

中序遍歷:遞迴遍歷當前節點的左子樹—當前節點—右子樹。

後序遍歷:遞迴遍歷當前節點的左子樹—右子樹—當前節點。

前序遍歷:遞迴遍歷當前節點的當前節點—左子樹—右子樹。

廣度優先遍歷:逐層訪問數的節點,然後從左往右訪問訪問所有孩子。

以遍歷下圖樹為例:

中序:45,55,57,59,60,67,100,101,107

後序:45,59,57,55,67,101,107,100,60

前序遍歷:60,55,45,57,59,100,67,107,101

廣度優先遍歷:60,55,100,45,57,67,107,59,101

首先還是對陣列進行判斷,如果前序遍歷陣列為null或後續遍歷陣列為null,則return null;

前序遍歷的第乙個結點就是二叉樹的根結點。

中序遍歷從第乙個到根結點之前的結點序列為左子樹,中序遍歷中根結點之後的結點序列為右子樹。

然後使用遞迴來處理根結點的左子樹和右子樹。

public

class

treenode

}

public

class

buildtree

return constructcore(preorder, inorder, 0, preorder.length - 1, 0, inorder.length - 1);

}public treenode constructcore(int preorder, int inorder, int pre, int preend, int in, int inend)

treenode root = new treenode(preorder[pre]);

int divider = 0;

//中序遍歷中尋找節點的左子樹

while (divider <= inend && inorder[divider] != root.val)

int offset = divider - in - 1;

root.left = constructcore(preorder, inorder, pre + 1, pre + 1 + offset, in, in + offset);

root.right = constructcore(preorder, inorder, pre + offset + 2, preend, divider + 1, inend);

return root;}}

參考:

lintcode 前序遍歷和中序遍歷樹構造二叉樹

解題 前序遍歷和中序遍歷樹構造二叉樹 根據前序遍歷和中序遍歷樹構造二叉樹.樣例給出中序遍歷 1,2,3 和前序遍歷 2,1,3 返回如下的樹 2 1 3 注意你可以假設樹中不存在相同數值的節點 解題和上一題很類似的。前序遍歷 根左右 中序遍歷 左根右 definition of treenode p...

前序遍歷 中序遍歷 後序遍歷

只要是搞計算機的,對資料結構中二叉樹遍歷都不陌生,但是如果用到的機會不多那麼就會慢慢淡忘,溫故而之新才是最好的學習方式,現在就重新溫習一下這方面的知識。首先我想先改變這幾個遍歷的名字 前根序遍歷,中根序遍歷,後根序遍歷 前中後本來就是相對於根結點來說的,少乙個字會產生很多不必要的誤解。1.前根序遍歷...

前序遍歷 中序遍歷 後序遍歷

遍歷是針對根節點的 前序遍歷順序 根節點 左子樹 右子樹 中序遍歷順序 左子樹 根節點 右子樹 後序遍歷順序 左子樹 右子樹 根節點 深入一點去理解這個排序順序是這樣的 前序遍歷 首先訪問根結點,然後遍歷左子樹,最後遍歷右子樹。在遍歷左 右子樹時,仍然先訪問根結點,然後遍歷左子樹,最後遍歷右子樹。中...