一、二叉樹的性質
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...