一、基本概念
每個結點最多有兩棵子樹,左子樹和右子樹,次序不可以顛倒。滿二叉樹:所有終端都在同一層次,且非終端結點的度數為2。性質:1、非空二叉樹的第n層上至多有2^(n-1)個元素。
2、深度為h的二叉樹至多有2^h-1個結點。
在滿二叉樹中若其深度為h,則其所包含的結點數必為2^h-1。完全二叉樹:除了最大的層次即成為一顆滿二叉樹且層次最大那層所有的結點均向左靠齊,即集中在左面的位置上,不能有空位置。
對於完全二叉樹,設乙個結點為i則其父節點為i/2,2i為左子節點,2i+1為右子節點。二、儲存結構
順序儲存:[cpp]view plain將資料結構存在一塊固定的陣列中。
copy
print?
#define length 100
typedef
char
datatype;
typedef
struct
nodenode;
node tree[length];
intlength;
introot;
雖然在遍歷速度上有一定的優勢,但因所佔空間比較大,是非主流二叉樹。二叉樹通常以鏈式儲存。鏈式儲存:
[cpp]view plain
copy
print?
typedef
char
datatype;
typedef
struct
binnodebinnode;
typedef
binnode* bintree;
//bintree本身是個指向結點的指標
三、二叉樹的遍歷
遍歷即將樹的所有結點訪問且僅訪問一次。按照根節點位置的不同分為前序遍歷,中序遍歷,後序遍歷。例如:求下面樹的三種遍歷前序遍歷:根節點->左子樹->右子樹
中序遍歷:左子樹->根節點->右子樹
後序遍歷:左子樹->右子樹->根節點
前序遍歷:abdefgc中序遍歷:debgfac
後序遍歷:edgfbca
題目輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列和中序遍歷序列,則重建二叉樹並返回。
/*** definition for binary tree
* public class treenode
* }*/
public class solution
//前序遍歷和中序遍歷序列
/*前序遍歷序列 根左右
中序遍歷序列 左根右
左根右可以區分左右(1 為根 4,7,2 都是它的左節點(下次處理的範圍是2,4,7) 5,3,8,6 都是它的右節點(下次處理的範圍是3,5,6,8))
1 2 3
4 5 6
7 8
*/private treenode reconstructbinarytree(int pre,int startpre,int endpre,int in,int startin,int endin)
return root;}}
二叉樹後續遍歷的幾種方式
資料結構定義 definition for a binary tree node.public class treenode treenode int val treenode int val,treenode left,treenode right 遞迴寫法 class solution 普通迭代...
二叉樹遍歷方式
先序遍歷 根 左子樹 右子樹 遞迴版本 public static void preprint treenode root 非遞迴版本 public static void preorder treenode root if s.empty 中序遍歷 左子樹 根 右子樹 遞迴版本 public st...
二叉樹幾種遍歷演算法
二叉樹的遍歷 include include include using namespace std typedef struct node bintree typedef struct node1 btnode void creatbintree1 bintree root 前序遍歷建立樹,形如 ...