定義和實現二叉樹

2021-09-07 04:15:13 字數 3947 閱讀 6456

/*1.節點:節點包含乙個資料元素和若干點到其子樹分支

2.度節點:節點的數目已成為節點的子樹

3.葉節點:為0的節點稱為葉結點

4.分支節點:度不為0的節點稱為分支節點

5.樹的度:樹中全部節點的度的最大值

6.二叉樹:是n(n>=0)個有限節點構成的集合。n=0的樹稱為空二叉樹。n=1的樹僅僅有乙個根結點;

n〉1的二叉樹由乙個根節點和至多兩個互不相交的,分別稱為左子樹和右子樹的子二叉樹構成

二叉樹不是有序樹,這是由於,二叉樹中某個節點即使僅僅有乙個子樹也要區分是左子樹還是右子樹;

而對於有序樹來說。假設某個節點僅僅有乙個子樹就必然是第乙個子樹

7.二叉樹全部結點的形態有5種:空節點,無左右子樹節點,僅僅有左子樹節點。僅僅有右子樹節點和左右子樹均存在的節點

8.滿二叉樹:在一棵二叉樹中。假設全部分支節點都存在左子樹和右子樹,而且全部葉子節點都在同一層,則這種二叉樹稱作滿二叉樹

9.全然二叉樹:假設一顆具有n個節點的二叉樹的結構與滿二叉樹的前n個節點的結構同樣,這種二叉樹稱為全然二叉樹

10二叉樹的性質:

(1):若規定根節點的層數為0,則一棵非空二叉樹的第i層上最多有2^i(i>=0)個節點

(2):

若規定僅僅有根節點的二叉樹的深度為0,則深度為k的二叉樹的最大節點數是2^(k+1)-1(k>=-1)

(3):

對於一棵非空的二叉樹。假設葉節點個數為n0,度為2的節點個數為n2。則有n0=n2+1

(4):

具有n個節點的全然二叉樹的深度k為大於或等於ln(n+1)-1的最小整數

(5):

對於具有n個節點的全然二叉樹,假設依照從上至下和從左至右的順序對全部節點序號從0開始順序編號,則對於序號為i(0<=i=n,則序號為i節點無左孩子

假設2i+2=n。則序號為i節點無右孩子

11.二叉樹的儲存結構

1.二叉樹的順序儲存結構

利用性質5,對於全然二叉樹能夠利用一維陣列儲存,假設不是全然二叉樹。則能夠補空節點,使成為全然二叉樹在進行儲存,

可是對於非全然二叉樹,可能要浪費非常多的空間。

2.二叉樹的鏈式儲存結構

二叉樹的鏈式儲存結構就是用指標建立二叉樹中節點之間的關係,二叉樹最經常使用的鏈式儲存結構是二叉鏈。二叉樹的二叉鏈儲存結構是一種經常使用的

二叉樹儲存結構。

二叉鏈存儲存結構的長處時。結構簡單。能夠方便的構造不論什麼形狀的二叉樹。並能夠方便的實現二叉樹的大多數操作。

二叉鏈儲存結構的缺點是,查詢當前節點的雙親節點操作實現比較麻煩

3.二叉樹的**指標儲存結構

利用一維陣列和結構體實現。利用陣列的下標進行**指標進行二叉樹的操作*/

#include#includetypedef char datatype;

typedef struct nodebitreenode;//節點的結構體定義

//初始化

void initiate(bitreenode **root)

//左插入節點

//若當前節點curr非空。則在curr的左子樹插入元素值為x的新節點

//原curr所指節點的左子樹成為新插入節點的左子樹

//若插入成功。則返回新插入節點的指標,否則返回空指標

bitreenode *insertleftnode(bitreenode *curr,datatype x)

t=curr->leftchild;//儲存原curr所指節點的左子樹

s=(bitreenode *)malloc(sizeof(bitreenode));//建立節點空間

s->data=x;//賦值

s->leftchild=t;//新插入節點的左子樹為原curr的左子樹

s->rightchild=null;//右子樹為空

curr->leftchild=s;//新節點成為curr的左子樹

return curr->leftchild;//返回新插入節點的指標

}//右插入節點

//若當前節點curr非空。則在curr的右子樹插入元素值為x的新節點

//原curr所指節點的右子樹成為新插入節點的右子樹

//若插入成功,則返回新插入節點的指標,否則返回空指標

bitreenode *insertrightnode(bitreenode *curr,datatype x)

t=curr->rightchild;//儲存原curr所指節點的右子樹

s=(bitreenode *)malloc(sizeof(bitreenode));//建立節點空間

s->data=x;//賦值

s->rightchild=t;//新插入節點的右子樹為原curr的右子樹

s->leftchild=null;//右子樹為空

curr->rightchild=s;//新節點成為curr的右子樹

return curr->rightchild;//返回新插入節點的指標

}//左刪除子樹

//若curr非空,則刪除curr所指節點的左子樹

//若刪除成功,則返回刪除節點的雙親節點。否則返回空指標

bitreenode *deletelefttree(bitreenode *curr)

//釋放節點

//destroy(&curr->leftchild);

curr->leftchild=null;//刪除後,當前節點的左子樹為null

return curr;//返回刪除節點的雙親節點

}//右刪除子樹

//若curr非空。則刪除curr所指節點的右子樹

//若刪除成功,則返回刪除節點的雙親節點,否則返回空指標

bitreenode *deleterighttree(bitreenode *curr)

//釋放節點

// destroy(&curr->rightchild);

curr->rightchild=null;//刪除後,當前節點的右子樹為null

return curr;//返回刪除節點的雙親節點

}void visit(datatype item)

//前序遍歷

/*1.訪問根節點

2.前序遍歷根節點的左子樹

3.前序遍歷根節點的右子樹

*/void preorder(bitreenode *root,void visit(datatype item))

}//中序遍歷

/*1.中序遍歷根節點的左子樹

2.訪問根節點

3.中序遍歷根節點的右子樹

*/void inorder(bitreenode *root,void visit(datatype item))

}//後序遍歷

/*1.後序遍歷根節點的左子樹

2.後序遍歷根節點的右子樹

3.訪問根節點

*/void postorder(bitreenode *root,void visit(datatype item))

}//撤銷二叉樹操作

void destroy(bitreenode **root)

if((*root)!=null&&(*root)->rightchild!=null)

free(*root);

}void printbitree(bitreenode *root,int n)

printbitree(root->rightchild,n+1);//遍歷列印右子樹

//訪問根節點

for(i=0;i0)

printbitree(root->leftchild,n+1);//遍歷列印右子樹

}//查詢資料元素

bitreenode *search(bitreenode *root,datatype x)else

} }return find;//返回查詢標誌

}void main()else

destroy(&root);

}

樹的實現和二叉樹的定義

為了實現樹,樹中的每乙個節點除資料外還要有一些指標,使得該節點的每乙個孩子節點都有乙個指標指向它。實際中由於樹中某個節點的孩子節點數可以變化很大且事先不知道,故在樹的資料結構中建立到各孩子節點直接的鏈結是不可行的 假如這樣做會產生太多的浪費空間 實際上比較簡單的做法 將樹中每個節點的所有孩子節點都放...

二叉樹 滿二叉樹和完全二叉樹

二叉樹是一種很重要的非線性資料結構,它是樹結構的一種重要的型別 它不是樹結構的特殊情況 其特徵是每個節點最多有兩個子樹。二叉樹的特點 二叉樹每個結點最多有 2個子結點,樹則無此限制 二叉樹中 結點的子樹 分成左子樹和右子樹,即使某結點只有一棵子樹,也要指明該子樹是左子樹,還是右子樹,就是說 二叉樹是...

二叉樹和完全二叉樹

二叉樹規律 假設根節點的高度為0 二叉樹是每個節點至多只有兩個節點的樹 深度為i所在的層至多有 2 i個節點 高度為k的二叉樹至多有2 k 1 1個節點 n0表示度為0的節點,n2表示度為2的節點,存在n0 n2 1 對所有樹有 節點個數 邊數 1 完全二叉樹規律 節點數為n的完全二叉樹,其高度為 ...