二叉樹的高度演算法
樹的高度:對非空二叉樹,其深度等於左子樹的最大深度加1。
Int Depth(BinTree *T){int dep1,dep2;
if(T==Null) return(0);
else{dep1=Depth(T->lchild);
dep2=Depth(T->rchild);
if(dep1>dep2) return(dep1+1);
else return(dep2+1);}
樹的寬度:按層遍歷二叉樹,採用一個隊列q,讓根結點入隊列,最後出隊列,若有左右子樹,則左右子樹根結點入隊列,如此反復,直到隊列為空。
int Width(BinTree *T){intfront=-1,rear=-1;
/*隊列初始化*/int flag=0,count=0,p;
/* pint CountNode (BTNode *t)
//節點總數{int num;if (t == NULL)num = 0;
elsenum = 1 + CountNode (t->lch) + CountNode (t->rch);
return (num);}void CountLeaf (BTNode *t)
//葉子節點總數{if (t != NULL){if (t->lch == NULL && t->rch == NULL)count ++;
// 全局變數CountLeaf (t->lch);CountLeaf (t->rch);}}。
(1)二叉樹的高度演算法擴展閱讀
方法:
求二叉樹的高度的演算法基於對二叉樹的三種遍歷,可以用後序遍歷的演算法加上記錄現在的高度和已知的最高的葉子的高度,當找到一個比已知高度還要高的葉子,刷新最高高度。
最後遍歷下來就是樹的高度,至於後序遍歷的演算法,是一本數據結構或者演算法的書中都有介紹和參考代碼
B. 求二叉樹高度的原理、演算法是什麼,越詳細越好,C語言,謝謝
首先分析二叉樹的深度(高度)和它的左、右子樹深度之間的關系。從二叉樹深度的定義可知,二叉樹的深度應為其左、右子樹深度的最大值加1。由此,需先分別求得左、右子樹的深度,演算法中「訪問結點」的操作為:求得左、右子樹深度的最大值,然後加
1
。
int
Depth
(BiTree
T
){
//
返回二叉樹的深度
if
(
!T
)
depthval
=
0;
else
{
depthLeft
=
Depth(
T->lchild
);
depthRight=
Depth(
T->rchild
);
depthval
=
1
+
(depthLeft
>
depthRight
?
depthLeft
:
depthRight);
}
return
depthval;
}
C. 二叉樹的深度和高度有什麼區別
一、概念不同
深度是從根節點數到它的葉節點,高度是從葉節點數到它的根節點。
二叉樹的深度是指所有結點中最深的結點所在的層數。
對於整棵樹來說,最深的葉結點的深度就是樹的深度;樹根的高度就是樹的高度。這樣樹的高度和深度是相等的。
對於樹中相同深度的每個結點來說,它們的高度不一定相同,這取決於每個結點下面的葉結點的深度。
二、定義不同
高度和深度是相反的表示,深度是從上到下數的,而高度是從下往上數。
三、計算方式不同
1、二叉樹深度演算法如下:
深度為m的滿二叉樹有2^m-1個結點;
具有n個結點的完全二叉樹的深度為[log2n]+1.(log2n是以2為底n的對數)。
2、分析二叉樹的深度(高度)和它的左、右子樹深度之間的關系。從二叉樹深度的定義可知,二叉樹的深度應為其左、右子樹深度的最大值加1。由此,需先分別求得左、右子樹的深度,演算法中「訪問結點」的操作為:求得左、右子樹深度的最大值,然後加 1 。
(3)二叉樹的高度演算法擴展閱讀:
樹是一種重要的非線性數據結構,直觀地看,它是數據元素按分支關系組織起來的結構,很象自然界中的樹那樣。樹結構在客觀世界中廣泛存在,如人類社會的族譜和各種社會組織機構都可用樹形象表示。
樹在計算機領域中也得到廣泛應用,如在編譯源程序如下時,可用樹表示源源程序如下的語法結構。又如在資料庫系統中,樹型結構也是信息的重要組織形式之一。一切具有層次關系的問題都可用樹來描述。滿二叉樹,完全二叉樹,排序二叉樹。
在計算機科學中,二叉樹是每個結點最多有兩個子樹的有序樹。通常子樹的根被稱作「左子樹」和「右子樹」。二叉樹常被用作二叉查找樹和二叉堆或是二叉排序樹。
D. 二叉樹的高度是什麼
二叉樹的高度是高度是從下往上數。
二叉樹是一棵空樹,或者是一棵由一個根節點和兩棵互不相交的,分別稱作根的左子樹和右子樹組成的非空樹;左子樹和右子樹又同樣都是二叉樹。
完全二叉樹的特點是葉子結點只可能出現在層序最大的兩層上,並且某個結點的左分支下子孫的最大層序與右分支下子孫的最大層序相等或大1。
二叉樹性質:
若對一棵有n個節點的完全二叉樹進行順序編號(1≤i≤n),那麼,對於編號為i(i≥1)的節點:
當i=1時,該節點為根,它無雙親節點。
當i>1時,該節點的雙親節點的編號為i/2。
若2i≤n,則有編號為2i的左節點,否則沒有左節點。
若2i+1≤n,則有編號為2i+1的右節點,否則沒有右節點。
E. 如何用非遞歸演算法求二叉樹的高度
如果是結點的定義中有深度這個屬性,那麼用一個隊列就可以了。
隊首放節點
隊尾取出節點
比如:根節點放入隊列
(開始只有這個一個節點在隊列中)
然後呢
從隊尾取出這個根節點
然後打散
把他的左右孩子放入對首(這時候有2個節點
也就是二叉樹的第二層)
之後從隊伍里取出這2個節點
打散
之後隊伍里應該是
二叉樹第三層的4個節點
。。。。。
這樣就把二叉樹層次遍歷了
因為有些節點沒有孩子節點
也就是葉子
這個隊列中的節點
逐漸會越來越少
最後一個取出隊列的節點
的深度也就是二叉樹的高度
如果結點定義沒有深度,我寫了一個方法,請樓主參考。
public
static
int
findlevel(BinaryNode
root)
{
ArrayList<LinkedList<BinaryNode>>
result=new
ArrayList<LinkedList<BinaryNode>>();
LinkedList<BinaryNode>
list=new
LinkedList<BinaryNode>();
list.add(root);
result.add(list);
int
level=0;
while(true)
{
list=new
LinkedList<BinaryNode>();
for(int
i=0;i<result.get(level).size();i++)
{
BinaryNode
tmp=result.get(level).get(i);
if(tmp.left!=null)
list.add(tmp.left);
if(tmp.right!=null)
list.add(tmp.right);
}
if(list.size()>0)
result.add(list);
else
break;
level++;
}
return
level;
}
其實思路和剛才說的是大同小異的,用一個level來記錄二叉樹的層次,最底的層次就是他的高度。
每一層都存在單獨的list里,這些list再存在一個arraylist里,這樣很容易就能知道每一層有哪些結點,如果這些結點有孩子,就把level++,直到某一層沒有任何結點有孩子,這時候level就是最後一層了。
F. 設計演算法統計二叉樹高度
#include<stdio.h>
#include<malloc.h>
typedef struct binode{
int data;
struct binode *lchild,*rchild;
}binode,*bitree;
typedef struct{
bitree elem[100];
int top;
}stack;
bitree creat_bt(){ //按擴展前序建二叉樹
bitree t;int x;
scanf("%d",&x);
if (x==0) t=NULL;
else { t=(bitree)malloc(sizeof(binode));
t->data=x;
t->lchild=creat_bt();
t->rchild=creat_bt();
}
return t;
}
void exchange(bitree t) //左、右子樹交換
{bitree p;
if(t!=NULL)
{ p=t->lchild;t->lchild=t->rchild;
t->rchild=p;
exchange(t->lchild);
exchange(t->rchild);
}
}
void inorder(bitree bt) //遞歸的中序遍歷
{ if (bt){
inorder(bt->lchild);
printf("% d",bt->data);
inorder(bt->rchild);
}
}
main()
{bitree root;
printf("\n");
printf("建二叉樹,輸入元素:");
root=creat_bt(); /*create tree of useing preorder*/
printf("交換前的中序序列是:");
inorder(root);
exchange(root);
printf("\n交換後的中序序列是:");
inorder(root);
printf("\n");
}
G. 什麼是二叉樹如何計算二叉樹的高度
看左子樹高還是右子樹高,高的那個的高度加一就是整個二叉樹的高度了。利用這個關系,搞個遞歸就出來了。
H. 二叉樹求高度,用棧模擬遞歸.怎麼實現
計算二叉樹的高度可以採用幾種不同的演算法。 演算法一:採用後序遍歷二叉樹,結點最大棧長即為二叉樹的高度; 演算法二:層次遍歷二叉樹,最大層次即為二叉樹的高度; 演算法三:採用遞歸演算法,求二叉樹的高度。
I. 以二叉樹鏈表作為二叉樹的存儲結構,怎麼編寫演算法計算返回二叉樹的高度
編寫方法如下:
J. 二叉樹演算法
二叉樹是沒有度為1的結點。
完全二叉樹定義:
若設二叉樹的高度為h,除第
h
層外,其它各層
(1~h-1)
的結點數都達到最大個數,第
h
層從右向左連續缺若干結點,這就是完全二叉樹。
完全二叉樹葉子結點的演算法:
如果一棵具有n個結點的深度為k的二叉樹,它的每一個結點都與深度為k的滿二叉樹中編號為1~n的結點一一對應,這棵二叉樹稱為完全二叉樹。
可以根據公式進行推導,假設n0是度為0的結點總數(即葉子結點數),n1是度為1的結點總數,n2是度為2的結點總數,由二叉樹的性質可知:n0=n2+1,則n=
n0+n1+n2(其中n為完全二叉樹的結點總數),由上述公式把n2消去得:n=
2n0+n1-1,由於完全二叉樹中度為1的結點數只有兩種可能0或1,由此得到n0=(n+1)/2或n0=n/2,合並成一個公式:n0=(n+1)/2
,就可根據完全二叉樹的結點總數計算出葉子結點數。
因此葉子結點數是(839+1)/2=420