16 二叉樹的遍歷

2021-10-03 14:38:31 字數 2701 閱讀 9333

一、相關概念

0、樹的結點包含乙個資料元素及若干指向其子樹的分支;

1.、樹的結點:包含乙個資料元素和指向其子樹的所有分支;

2.、結點的度:乙個結點擁有的子樹個數,度為零的結點稱為葉結點;

3.、樹的度:樹中所有結點的度的最大值 max(d(i));

含義:樹中最大分支數為樹的度;

4.、結點的層次及樹的深度:根為第一層,根的孩子為第二層,若某結點為第k層,則其孩子為k+1層;

樹中結點的最大層次稱為樹的深度或高度;

5、森林:是m(m>=0)棵互不相交的樹的集合;

森林與樹概念相近,相互很容易轉換;

6 、有序樹、無序樹  如果樹中每棵子樹從左向右的排列擁有一定的順序,不得互換,則稱為有序樹,否則稱為無序樹。

7、二叉樹(binarytree)是n(n≥0)個結點的有限集。它或者是空集(n=0),或者同時滿足以下兩個條件:

(1) 有且僅有乙個根結點;

(2) 其餘的結點分成兩棵互不相交的左子樹和右子樹。

二叉樹與樹有區別:樹至少應有乙個結點,而二叉樹可以為空;樹的子樹沒有順序,但如果二叉樹的根結點只有一棵子樹,必須明確區分它是左子樹還是右子樹,因為兩者將構成不同形態的二叉樹。因此,二叉樹不是樹的特例。它們是兩種不同的資料結構。

8、兩種特殊形態的二叉樹

(1) 滿二叉樹(fullbinarytree) 

深度為k,且有2k-1個結點的二叉樹。

特點:(1)每一層上結點數都達到最大;

(2)度為1的結點n1=0,樹葉都在最下一層上。

(2) 完全二叉樹(complete binarytree)  

深度為k,結點數為n的二叉樹,當且僅當每個結點的編號都與相同深度的滿二叉樹中從1到n的結點一一對應時,稱為完全二叉樹。

完全二叉樹的特點:

(1)每個結點i的左子樹的深度lhi-其結點i的右子樹的深度rhi等於0或1,即葉結點只可能出現在層次最大或次最大的兩層上。

(2)完全二叉樹結點數n滿足2k-1-1<n≤2k-1 

(3)滿二叉樹一定是完全二叉樹,反之不成立。

9、二叉樹的性質

性質1  在二叉樹的第i層上至多有2i-1 個結點(i≥1)。 

性質2  深度為k的二叉樹至多有2k-1個結點(k≥1)。 

(深度一定,二叉樹的最大結點數也確定)

性質3  二叉樹中,終端結點數n0與度為2的結點數n2有如下關係:  

n0=n2+1

性質4  結點數為n的完全二叉樹,其深度為以2為底的log(n)加1。

儲存結構如下:

typedef struct node

btree,*tree;

其中,tree是指向根結點的指標。

性質5  具有n個結點的二叉鍊錶中,共有2n個指標域。其中只有n-1個用來指示結點的左、右孩子,其餘的n+1個指標域為空。

二、遍歷演算法

分中序(字首表示,也稱波蘭式),中序(中綴表示),後序(字尾表示,也稱逆波蘭式)三咱遍歷方法。

先序:preorder(btree *root)         //前序遍歷

//if

}//while

return ok;

三、演算法實現(舉個例子)

#include "stdio.h"

#include "stdlib.h"

typedef char elemtype3;

typedef  int status; 

#define ok 1

#define error 0

int count=0;

typedef struct bitnode         //定義鍊錶結構

elemtype3 data;             //定義結點值

struct bitnode *lchild;       //定義左子結點指標

struct bitnode *rchild;       //定義右子結點指標

}bitnode,*bitree;

status preorder(bitree root)

if(root!=null)

printf("%c\n",root->data);

preorder(root->lchild);

preorder(root->rchild);

return ok;

status inorder(bitree root)

if(root!=null)

inorder(root->lchild);

printf("%c\n",root->data);

inorder(root->rchild);

return ok;

status createbitree(bitree &t)

//else

return ok;

}//createbitree

int main()

bitree t;       

createbitree(t);

preorder(t);

inorder(t);

return 1;

二叉樹的遍歷 二叉樹遍歷與儲存

在資料結構中,二叉樹是非常重要的結構。例如 資料庫中經常用到b 樹結構。那麼資料庫是如何去單個查詢或者範圍查詢?首先得理解二叉樹的幾種遍歷順序 先序 中序 後序 層次遍歷。先序 根節點 左子樹 右子樹 中序 左子樹 根節點 右子樹 後序 左子樹 右子樹 根節點 按層級 class node if c...

構建二叉樹 遍歷二叉樹

陣列法構建二叉樹 public class main public static void main string args 用陣列的方式構建二叉樹 public static void createbintree 把linkedlist集合轉成二叉樹的形式 for int j 0 j 最後乙個父節...

玩轉二叉樹(二叉樹的遍歷)

時間限制 400 ms 記憶體限制 65536 kb 長度限制 8000 b 判題程式 standard 作者 陳越 給定一棵二叉樹的中序遍歷和前序遍歷,請你先將樹做個鏡面反轉,再輸出反轉後的層序遍歷的序列。所謂鏡面反轉,是指將所有非葉結點的左右孩子對換。這裡假設鍵值都是互不相等的正整數。輸入格式 ...