根據前序遍歷和中序遍歷樹構造二叉樹.
注意事項
你可以假設樹中不存在相同數值的節點
樣例給出中序遍歷:[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.前根序遍歷...
前序遍歷 中序遍歷 後序遍歷
遍歷是針對根節點的 前序遍歷順序 根節點 左子樹 右子樹 中序遍歷順序 左子樹 根節點 右子樹 後序遍歷順序 左子樹 右子樹 根節點 深入一點去理解這個排序順序是這樣的 前序遍歷 首先訪問根結點,然後遍歷左子樹,最後遍歷右子樹。在遍歷左 右子樹時,仍然先訪問根結點,然後遍歷左子樹,最後遍歷右子樹。中...