題目描述
輸入某二叉樹的前序遍歷和中序遍歷結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不包含重複的數字。例如輸入前序遍歷序列:和中序遍歷,則重建出圖中所示二叉樹並且輸出它的頭結點。
解題思路
演算法**
/** * 輸入某二叉樹的前序遍歷和中序遍歷結果,請重建出該二叉樹。
* 假設輸入的前序遍歷和中序遍歷的結果中都不包含重複的數字。
* 例如輸入前序遍歷序列:和中序遍歷,
* 則重建出圖中所示二叉樹並且輸出它的頭結點。
*/public
class
offer7
;int inorder=
; offer7 constructbinarytree =
newoffer7()
; binarytreenode node = constructbinarytree.
construct
(preorder, inorder, preorder.length)
;// 前序列印
printprebinarytree
(node);}
/** * 初始化判斷
** @param preorder
* @param inorder
* @param prelength
* @return
*/public binarytreenode construct
(int preorder,
int inorder,
int prelength)
else
return binarytreenode;
}/**
* 區分左右子樹,找出根節點核心
** @param preorder
* @param startpreindex
* @param endpreindex
* @param inorder
* @param startinindex
* @param endinindex
* @return
*/public binarytreenode coreconstruct
(int
preorder,
int startpreindex,
int endpreindex,
int[
] inorder,
int startinindex,
int endinindex)
else
// 左子樹長度
int letftreelength = rootinindex - startinindex;
// 左子樹右端值
int leftpreendindex = startpreindex + letftreelength;
// 構建左子樹
if(letftreelength >0)
// 如果左子樹長度小於 先序遍歷的元素個數 說明存在右子樹
if(letftreelength < endpreindex - startpreindex)
return rootnode;}}
// 按照前序遍歷列印二叉樹的節點
public
static
void
printprebinarytree
(binarytreenode root)
else
if(root.lefttree != null)
if(root.righttree != null)}}
/** * 二叉樹資料結構
*/class
binarytreenode
}附錄
該題原始碼在我的 ?github 上面!
劍指offer 二叉樹 二叉樹搜尋樹
package bst import j a.util.public class bst if pre.length 0 in.length 0 treenode root new treenode pre 0 for int i 0 i in.length i return root 判斷給定陣列...
劍指offer 平衡二叉樹
輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹 1 重複遍歷結點 參考上一題求二叉樹的深度,先求出根結點的左右子樹的深度,然後判斷它們的深度相差不超過1,如果否,則不是一棵二叉樹 如果是,再用同樣的方法分別判斷左子樹和右子樹是否為平衡二叉樹,如果都是,則這就是一棵平衡二叉樹。但上面的方法在判斷子樹是否...
劍指offer 重建二叉樹
重建二叉樹2.cpp 定義控制台應用程式的入口點。題目描述 輸入乙個二叉樹的前序遍歷和中序遍歷,輸出這顆二叉樹 思路 前序遍歷的第乙個節點一定是這個二叉樹的根節點,這個節點將二叉樹分為左右子樹兩個部分,然後進行遞迴求解 include stdafx.h include vector using na...