樹的定義:
樹是資料結構和演算法分析與設計中的一種非常重要的結構,由n個結點組成的具有層次結構的模型。
其主要有以下幾個特點:
1、有乙個根結點,一般稱為root結點
2、每乙個元素都被稱為node
3、除了root結點外,其餘的結點都會被分為n個互不相交的集合(子樹)
樹形結構的基本術語:
結點:樹形結構裡面的元素
子樹:當結點大於1時,其餘的結點分為互不相交的集合稱為子樹
度:乙個結點擁有的子樹數量稱為結點的度
葉子:度為0的結點
孩子:結點的子樹的根稱為孩子結點
雙親:和孩子結點對應
兄弟:同乙個雙親結點
深度:結點的最大層次稱為樹的深度,計算時間複雜度用
森林:由n個互不相交的樹稱為森林
二叉樹(binarytree):
一種特殊的樹形結構,每個結點最多只有兩個子樹。
在二叉樹的第n層上,最多有2^(n-1)個結點,
如:第2層最多有2個結點,第3層最多有4個結點。
滿二叉樹:
假設樹的深度為m,則有2^m-1個結點的二叉樹。
如:樹的深度為3,滿二叉樹的結點數為2^3-1=7
二叉樹的三種遍歷(重點):
前序遍歷:根結點 -> 左子樹 -> 右子樹
中序遍歷:左子樹 -> 根結點 -> 右子樹
後序遍歷:左子樹 -> 右子樹 -> 根結點
遍歷都是從根結點開始,遇根結點輸出。
我們以中序遍歷為例子:
首先找到a,a有左子樹,找到b。
把b當做子樹,找b的左子樹,沒有返回b,輸出b。
然後找b的右子樹,找到c。
把c當做子樹,找c的左子樹,找到d。
d沒有子樹,所以輸出d。
此時c的左子樹結束,返回c,輸出c。
此時a的左子樹全部結束,返回a,輸出a。
接下來開始遍歷a的右子樹。
跟上面步驟一樣,不做贅述。
所以中序遍歷得出:
b -> d -> c -> a -> e -> h -> g -> k -> f
因此三種遍歷方式得出的結果是:
前序遍歷:abcdefghk
中序遍歷:bdcaehgkf
後序遍歷:dcbhkgfea
我們來看看**如何實現:
package com.monkey.springdemo.utils.sort;
class node
public string getdata()
public void setdata(string data)
public node getleftnode()
public void setleftnode(node leftnode)
public node getrightnode()
public void setrightnode(node rightnode)
}public class binarytree
public void print(node node)
//前序遍歷:根(輸出)-> 左 -> 右
public void pre(node root)
//遍歷右子樹
if (root.getrightnode() != null)
}//中序遍歷: 左 -> 根(輸出)-> 右
public void in(node root)
//遍歷根結點
print(root);
//遍歷右子樹
if (root.getrightnode() != null)
}//後序遍歷: 左 -> 右 -> 根(輸出)
public void post(node root)
//遍歷右子樹
if (root.getrightnode() != null)
//遍歷根結點
print(root);}}
前、中、後的遍歷方式,
主要區別在於結點與子樹的遍歷順序。
大家搞懂了這個順序,自然而然就理解了遍歷方式。
二叉樹基礎
二叉樹 二叉樹是一棵特殊的樹,二叉樹每個節點最多有兩個孩子結點,分別稱為左孩子和右孩子。二叉樹節點結構 二叉樹的建立 node createtree const t a,size t size,size t index,const t invilid return root 返回根節點 前序遍歷 前...
二叉樹基礎
最近學習的一些筆記,記錄一下 樹是一種非線性結構,樹 這種資料結構真的很像我們現實生活中的 樹 這裡面每個元素我們叫 節點 例如下面這幅圖,a 節點就是 b 節點的父節點,b 節點是 a 節點的子節點。b c d 這三個節點的父節點是同乙個節點,所以它們之間互稱為兄弟節點。我們把沒有父節點的節點叫作...
二叉樹基礎
1.二叉樹的定義 每個結點最多只有兩棵子樹 子樹左右有順序之分 2.常見的二叉樹型別 滿二叉樹 看起來 完美 而又 平衡 的樹 完全二叉樹 首先從上至下,從左至右按順序給結點編號,再從下至上,從右至左按順序刪除結點。由此可見滿二叉樹是一棵特殊的完全二叉樹,而完全二叉樹是 缺胳膊少腿 的滿二叉樹。3....