結構:
除了根節點之外每個節點只有乙個父節點,根節點沒有父節點。
除了葉節點之外所有節點都有乙個或多個子節點,葉子節點沒有子節點。
父節點和子節點之間用指標鏈結。
由於樹的操作會涉及大量的指標,因此面試題都不容易。
樹的遍歷方式:
前序遍歷:根-左-右
中序遍歷:左-根-右
後序遍歷:左-右-根
層序遍歷:根-葉
二叉樹的特例:
二叉搜尋樹,左子節點總是小於或等於根節點,右子節點總是大於或等於根節點
可以平均在o(logn)的時間內根據數值在二叉搜尋樹中找到乙個節點
另外兩個特例是堆和紅黑樹
堆分為最大堆和最小堆,最大堆中根節點的值最大,最小堆中根結點的值最小
很多需要快速找到最大值和最小值的問題可以用堆來解決
紅黑樹是把樹中的節點定義為紅黑兩種顏色,通過規則確保從根節點到葉節點的最長路徑的長度不超過最短路徑的兩倍
面試題7.重建二叉樹
題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字
二叉樹的結構
class重建過程,是乙個遞迴的過程bitree
}
例如輸入前序遍歷和中序遍歷
可見,1左邊是,右邊是
觀察原始中序遍歷陣列,發現正好是1分割左右,因此左邊的中序陣列額右邊的中序陣列就可以得到了。
而觀察先序陣列,先序陣列的結構正好是這個順序,因此就可以通過這個規律得到先序遍歷的左子樹和右子樹。
最後遞迴來一步一步完成二叉樹左子樹和右子樹的重建
public面試題8.二叉樹的下乙個節點static bitree reconstruct(int preorder, int
inorder)
//找到中序陣列根節點值位置
int mark=-1;
for(int i=0;i)
}if(mark>0)
//記錄右子樹陣列
for(int j=0;j)
//左子樹遞迴
root.left=reconstruct(leftpreorder,leftinorder);
}else
if(preorder.length-1-mark>0)
root.right=reconstruct(rightpreorder,rightinorder);
}else
return
root;
}public
static
void
main(string args);
int inorder=;
reconstruct(preorder,inorder);
}
題目:給定乙個二叉樹和其中乙個節點,如何找出中序遍歷序列的下乙個節點?樹中的節點除了有兩個分別指向左右子節點的指標,還有乙個指向父節點的指標
分情況討論:
①如果乙個節點既有左子樹又有右子樹:
下乙個節點就是它的右子樹中的最左子節點
②如果乙個節點有左子樹沒有右子樹:
如果該節點有父節點且是父節點的右子節點:那麼下乙個節點需要沿著父節點的指標向上遍歷,直到找到乙個新節點,原節點存在於這個新節點的左子樹中
③如果乙個節點沒有左子樹有右子樹:
下乙個節點就是它的右子樹中的最左子節點
④如果乙個節點既沒有左子樹也沒有右子樹
如果該節點是父節點的右節點:那麼下乙個節點需要沿著父節點的指標向上遍歷,直到找到乙個新節點,原節點存在於這個新節點的左子樹中
綜合幾種情況發現:
只存在兩種情況,即存在右子樹和不存在右子樹
①如果乙個節點有右子樹:下乙個節點就是它的右子樹中的最左子節點
②如果乙個節點沒有右子樹:
是父節點的右子節點:那麼下乙個節點需要沿著父節點的指標向上遍歷,直到找到乙個新節點,原節點存在於這個新節點的左子樹中
publicclass
nextnode
if(node.right!=null)
return
resnode;
}else
if(node.right==null)
else
//是父節點的右子節點
else
if(node.parent.right==node)
resnode=node.parent;}}
}return
resnode;}}
資料結構 樹
樹的概念 1.家族樹 在現實生活中,有入如下血統關係的家族可用樹形圖表示 張源有三個孩子張明 張亮和張麗 張明有兩個孩子張林和張維 張亮有三個孩子張平 張華和張群 張平有兩個孩子張晶和張磊。以上表示很像一棵倒畫的樹。其中 樹根 是張源,樹的 分支點 是張明 張亮和張平,該家族的其餘成員均是 樹葉 而...
資料結構 樹
1 定義 樹是一種非線性結構,是一種一對多的資料結構。分析樹的結構,我們用遞迴的方法,根結點下面又可以看做是子樹。2 樹的儲存結構 我們一般用孩子兄弟法儲存。也就是把乙個結點的左邊第乙個孩子放在此結點的左邊孩子,把此結點的右兄弟放在此結點的右邊孩子。這樣就產生了二叉樹。二叉樹和樹可以相互對應。3 二...
資料結構 樹
二叉樹性質回顧 滿二叉樹 完全二叉樹等 給定一棵二叉樹,要求分層遍歷該二叉樹,即從上到下按層次訪問該樹,每一層單獨輸出一行,每一層要求訪問的順序為從左到右。我們在遍歷的過程中將該層節點的孩子節點壓入乙個佇列,這樣就可以實現從上到下一層一層地遍歷該二叉樹。層序遍歷 並分層列印 如果不用分層的話只用佇列...