資料結構 二叉樹入門(一)

2021-09-17 01:48:49 字數 3299 閱讀 3031

每個節點的度都不超過2,左右子樹的順序不能顛倒。

如上圖:該二叉樹共有8個結點,深度為4,葉子節點的個數是4。

深度:最深層次的樹的層數。

葉子節點:無子樹的結點。

以上述二叉樹為例:

1.先序遍歷:根、左、右——(a-b-d-e-h-c-f-g)

2.中序遍歷:左、根、右——(d-b-e-h-a-f-c-g)

3.後序遍歷:左、右、根——(d-h-e-b-f-g-c-a)

1.儲存一棵二叉樹

給出二叉樹的結構體:

typedef struct tree tree;
其實這就相當於是鍊錶,不過有兩個指標罷了,將其連線起來即可

2.遍歷一棵二叉樹(遞迴遍歷)

遍歷有先序、中序、後序。

以先序為例:

①遵循根、左、右的順序。(將每個結點都列印出來)

②遞迴結尾的標誌就是樹為空時。

中序與後序同理。

3.求二叉樹節點的個數

方法一:遍歷思想:遍歷途中計數即可。(無論哪種遍歷方式)

設定乙個全域性變數,在遍歷過程中計數即可。

方法二:分而治之:結點的個數=左子樹的節點個數+右子樹的結點個數+1。

4.求二叉樹的深度

分而治之的思想:

深度=max(左子樹的深度,右子樹的深度)+根。

5.求二叉樹第k層結點的個數

分而治之:左子樹的(k-1)層的節點數+右子樹的(k-1)層的節點數即可。

6.在二叉樹中查詢乙個節點,找到就返回該節點的位址,找不到就返回空

遍歷該二叉樹:

①先判斷根是否是,根節點若是,直接返回根節點的位址即可。

②如果根節點中沒有,就在左子樹中找。找到返回。

③如果左子樹中沒有,就在右子樹中找。找到返回

④右子樹中也沒有,即該二叉樹中沒有,返回null。

#include #include #includetypedef struct tree tree;

//建立結點

tree *creatnode(char value)

//一.三種遍歷二叉樹的方式

// 1.先序遍歷二叉樹

void preorder(tree* root)

//二叉樹不為空,開始先序遍歷:根、左、右

printf("%c ", root->value);

preorder(root->left);

preorder(root->right);

return;

}// 2.中序遍歷二叉樹

void midorder(tree* root)

//不為空,中序遍歷:左、根、右

midorder(root->left);

printf("%c ", root->value);

midorder(root->right);

return;

}// 3.後序遍歷二叉樹

void suborder(tree* root)

//非空,進行後序遍歷:左、右、根

suborder(root->left);

suborder(root->right);

printf("%c ", root->value);

return;

}int count;//用來計算二叉樹中的節點個數

//二.求二叉樹的結點個數

// 1.隨便哪種遍歷方式進行計數即可,以先序為例

int numnode(tree* root)

//非空,遍歷計數

count++;

numnode(root->left);

numnode(root->right);

return count;

}// 2.分而治之:左+右+根

int numnode2(tree* root)

return numnode2(root->left) + numnode2(root->right) + 1;

}//三.求二叉樹的深度

int depthtree(tree* root)

//非空,開始進行計數,max(左子樹的深度,右子樹的深度)+根

int left = depthtree(root->left);

int right = depthtree(root->right);

return (left > right ? left : right) + 1;

}//四.求二叉樹的第k層的結點個數

int klevelsize(tree* root,int k)

if (k == 1)

//開始進行計數,左子樹的k-1層的節點數+右子樹的k-1層的節點數

return klevelsize(root->left, k - 1) + klevelsize(root->right, k - 1);

}//五.查詢結點,並返回其位址

tree* find(tree* root, char val)

//再判斷根節點是否是目標節點

if (root->value == val)

//根節點不是,查詢左子樹,左子樹沒有,再查詢右子樹

//開始查詢左子樹

tree* result = find(root->left,val);

if (result != null)

//左子樹中沒找到,在右子樹中查詢

result = find(root->right, val);

if (result != null)

//整棵樹都查詢完了,沒找到,返回null

return null;

}void test()

int main()

1.對二叉樹的操作同煉表一樣,要先對樹進行判空操作2.分而治之:遇到問題可以將二叉樹拆分成左子樹和右子樹來思考進一步簡化問題。3.遞迴的邊界條件控制:常常是樹空。

資料結構 二叉樹 反轉二叉樹

include using namespace std define maxsize 1000 struct binary tree node class queue queue queue void queue push binary tree node btn binary tree node ...

《資料結構》 二叉樹

二叉樹 是 n個結點的有限集,它或為空集,或由乙個根結點及兩棵互不相交的 分別稱為該根的左子樹和右子樹的二叉樹組成。二叉樹不是樹的特殊情況,這是兩種不同的資料結構 它與無序樹和度為 2的有序樹不同。二叉樹的性質 1 二叉樹第 i層上的結點數最多為 2 i 1 2 深度為 k的二叉樹至多有 2 k 1...

資料結構 二叉樹

1.二叉樹 二叉樹是一種特殊結構的樹,每個節點中最多有兩個子節點,如圖1所示 圖1 二叉樹 在圖1中的二叉樹裡,a c有兩個子節點,b d有乙個子節點。對於二叉樹還有圖2中的以下情況 圖2 二叉樹的特殊情況 在博文中還介紹了滿二叉樹和完全二叉樹還有其他的特殊二叉樹。2.二叉樹的實現 有兩種實現方式,...