二叉樹的遍歷 查詢

2021-08-07 14:51:30 字數 3591 閱讀 3594

一、二叉樹的性質

1、非空二叉樹的第n層上至多有2^(n-1)個元素。

2、深度為h的二叉樹至多有2^h-1個結點。

3、滿二叉樹:所有終端都在同一層次,且非終端結點的度數為2。在滿二叉樹中若其深

度為h,則其所包含的結點數必為2^h-1。

4、完全二叉樹:葉子節點只能出現在最下兩層,最下層的葉子一定集中在左部連續的位

置。如果節點只有乙個孩子,只可能是左孩子。

5、對於完全二叉樹,設乙個結點為i則其父節點為i/2,2i為左子節點,2i+1為右子節點

(如果有左右節點的話)。

6、每個結點最多有兩棵子樹,左子樹和右子樹,次序不可以顛倒。

二、儲存結構

1、順序儲存:將資料結構存在一塊固定的陣列中。

#define length 100  

typedef

char datatype;

typedef

struct nodenode;

node tree[length];

int length;

int root;

2、鏈式儲存:二叉樹通常以鏈式儲存,定義如下:

typedef

char datatype;

typedef

struct bitnode

bitnode,*bitree;

三、二叉樹的建立

為了能讓每個節點確認是否有左右孩子,將二叉樹中的每個節點的空指標引出乙個虛節點,用「#」表示,構建出的二叉樹為原二叉樹的擴充套件二叉樹,就可以做到乙個遍歷序列確定一棵二叉樹了。

//按前序輸入建立二叉樹

void createbitree(bitree *t)

return

0;}

三、二叉樹的遍歷、

遍歷即將樹的所有結點訪問且僅訪問一次。按照根節點位置的不同分為前序遍歷,中序遍歷,後序遍歷。

前序遍歷:根節點->左子樹->右子樹

中序遍歷:左子樹->根節點->右子樹

後序遍歷:左子樹->右子樹->根節點

1、遞迴演算法

//前序遍歷

void preorder(bitree t)

//中序遍歷

void inorder(bitree t)

//後序遍歷

void postorder(bitree t)

2、非遞迴演算法

<1>先序遍歷:訪問t->data後,將t入棧,遍歷左子樹;遍歷完左子樹返回時,棧頂元

素應為t,出棧,再先序遍歷t的右子樹。

void preorder2(bitree t)  

else

}}

<2>中序遍歷:t是要遍歷樹的根指標,中序遍歷要求在遍歷完左子樹後,訪問根,再遍歷右子樹。

先將t入棧,遍歷左子樹;遍歷完左子樹返回時,棧頂元素應為t,出棧,訪問t->data,再中序遍歷t的右子樹。

void inorder2(bitree t)  

else

}}

<3>後序遍歷:t是要遍歷樹的根指標,後序遍歷要求在遍歷完左右子樹後,再訪問根。需要判斷根結點的左右子樹是否均遍歷過。

//後序遍歷(非遞迴)  

typedef struct bitnodepostbitnodepost,*bitreepost;

void postorder2(bitree t)

//左右子樹訪問完畢訪問根節點

while(!

stack

.empty() && (stack

.top())->

tag==

'r')

//遍歷右子樹

if(!

stack

.empty())

} }

<4>層次遍歷:按從頂向下,從左至右的順序來逐層訪問每個節點,層次遍歷的過程中需要用佇列。

//層次遍歷  

void levelorder(bitree t)

//右子樹不空,將右子樹入隊

if(p->rchild != null)

} }

總的**實現

#include

#include

#include

using

namespace

std;

//二叉樹結點

typedef

struct bitnodebitnode,*bitree;

//按先序序列建立二叉樹

int createbitree(bitree *t)

else

return

0;

} //前序遍歷

void preorder(bitree t)

//中序遍歷

void inorder(bitree t)

//後序遍歷

void postorder(bitree t)

/* 先序遍歷(非遞迴)

思路:訪問t->data後,將t入棧,遍歷左子樹;遍歷完左子樹返回時,棧頂元素應為t,出棧,再先序遍歷t的右子樹。

*/void preorder2(bitree t)

else

}//while

} /* 中序遍歷(非遞迴)

思路:t是要遍歷樹的根指標,中序遍歷要求在遍歷完左子樹後,訪問根,再遍歷右子樹。

先將t入棧,遍歷左子樹;遍歷完左子樹返回時,棧頂元素應為t,出棧,訪問t->data,再中序遍歷t的右子樹。

*/void inorder2(bitree t)

else

}//while

} //後序遍歷(非遞迴)

typedef

struct bitnodepostbitnodepost,*bitreepost;

void postorder2(bitree t)

//左右子樹訪問完畢訪問根節點

while(!stack.empty() && (stack.top())->tag == 'r')

//遍歷右子樹

if(!stack.empty())

}//while

} //層次遍歷

void levelorder(bitree t)

//右子樹不空,將右子樹入隊

if(p->rchild != null)

} } int main()

四、二叉樹的查詢

bitree search_tree(bitree t,datatype x)  

return t;

}

二叉樹遍歷查詢

1 前序遍歷 先輸出父節點,再遍歷左子樹和右子樹 2 中序遍歷 先遍歷左子樹,再輸出父節點,再遍歷右子樹 3 後序遍歷 先遍歷左子樹,再遍歷右子樹,最後輸出父節點 4 小結 看輸出父節點的順序,就確定是前序,中序還是後序 package com.atguigu.tree public class b...

二叉查詢樹(BST)及二叉樹的遍歷

一 二叉查詢樹 bst 1 二叉查詢樹的特徵 二叉查詢樹 bst 也稱為二叉搜尋樹或二叉排序樹。二叉查詢樹的節點包含鍵值key。二叉查詢樹或者是一棵空樹,否則要求 若它的左子樹不為空,那麼左子樹上所有節點的key都小於根節點的key。若它的右子樹不為空,那麼右子樹上所有節點的key都大於根節點的ke...

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

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