1樓:匿名使用者
int height(bitree t)
if 中的n應該是v。
其思想是,一個節點的深度是他的兩個子節點中深度的最大值再加上1。這個演算法中u得到其左子數的深度,v獲得右子樹的深度。則這個節點的深度就是u和v中最大的再加上1。
要想獲得樹的深度,就先獲得這個樹中根節點的兩個兒子的深度,比較兩個兒子的深度,取其中最大值在加上1最終獲得樹的深度。根節點的兩個兒子的深度就通過這個上面的原則遞迴求得。
2樓:匿名使用者
u,v 分別求出當前節點左子樹和右子樹的深度(高度),然後當前節點的 深度就等於左右子樹裡面較大的那個+1.
if (u>n) return (u+1)return (v+1)
這句就是返回較深的+1.
u=height(t->lchild);
v=height(t->rchild);
這兩句就是遞迴的呼叫,求深度了。
if (t==null) return 0;
這個就是終止條件了,如果沒有子節點就返回。
關於求二叉樹深度的遞迴演算法
3樓:
關於遞迴,你可以看成是一句一句往下執行嘛。需要儲存狀態的時候,系統就會自動用棧幫你儲存。就依你說得那個為例:
n為全域性變數,初值為0;
第一次呼叫height(t),假設t!=null
由於t!=null:跳過if (t==null) return 0;
關鍵到了u=height(t->lchild); 呼叫本身的函式:此時的t->lchild儲存在棧中,既然是呼叫就得從函式開頭執行:
看下這時候t2(其實就是t->lchild),if (t==null) return 0;
這裡假設t不是null,就繼續執行在遇到u=height(t->lchild); 在調這個函式本身——
這裡就假設它為t->lchild==null吧。這下可好,這個函式執行return 0;
慢著:第二次函式呼叫u=height(t->lchild)中的函式值已經計算出來啦。這時u=0;
你還記得第二次呼叫執行到了v=height(t->rchild); 這句話吧?好,這個過程就和u=height(t->lchild)完全一樣。
這裡也假設得到的v=0
則第二次呼叫到了if (u>n) return (u+1)
return (v+1)
得到一個返回值,不如就假設u〉n,於是返回值1;
好,這一波完畢;
你還記得第一次呼叫的height吧,這時把返回值給u,u=1;
然後執行到第一次呼叫中的v=height(t->rchild); 了。分析同上。
這個過程的確比較複雜。慢慢琢磨吧。呵呵。
4樓:金鑽世家
基本思路就是如果當前節點還有子節點,則繼續訪問,遞迴的找尋子節點直到葉子節點為止。
procedure tree(a:node,depth:integer);
begin
if resultnil then tree(a.leftchild,depth+1);
if a.rightchild<>nil then tree(a.rightchild,depth+1);
end;
注:result是全域性變數,是結果
實際上最好不用什麼全域性變數
int depth(node *bt)
全域性變數是bug
int height(bitree t)
// struct bnode
5樓:匿名使用者
意思就是
某結點的深度height(t)
等於他的深度最大的子樹的深度height(t的最深子樹)加1 return heitht(t的最深子樹)+1
6樓:匿名使用者
我記得資料結構書上好像是有,可能是非遞迴的,具體的忘記了,不過當時我也是挺懵的,到現在也不是很明白其所以然!
7樓:青蔥歲月如歌般
這樣理解對嗎?同學?
1.編寫遞迴演算法,計算二叉樹中葉子結點的數目
8樓:邢丹青
#include
using namespace std;
typedef struct tnode//二叉樹結構*bitree;
中序遍歷方式建立二叉樹 ,輸入#代表該結點為空
else t=null;
}int countleaf(bitree t)}return leafnum;
}//用來測試的main函式,
int main()
9樓:匿名使用者
#include
using namespace std;static int sum=0;template
void count(t* root)
}int main(void) //這裡bai我沒有樹的du節點zhi定義,所以直
dao接用模板回
替代答了
10樓:匿名使用者
第三題:console.write("請輸入一抄個字元bai串(以@du結束):");
string str = console.readline();
if (str[str.length - 1] == '@')else
for (int i = str.length - 2; i >= str.length / 2 - 1; i--)
if (str1.equals(str2))else}}
else
11樓:學習學習ing中
#include
#include
struct node;
typedef struct node node;
node *create()
else p=null;
return p;
}int run(node *t)
}return count;
}main()
printf("\n");}
中序遞迴遍歷二叉樹的演算法?(資料結構)
12樓:匿名使用者
#include
#include
#define maxsize 100
typedef char elemtype;
typedef struct node
bitnode;
}}j++;
ch=str[j];}}
bitnode *find(bitnode *b,elemtype x)
}bitnode *lchild(bitnode *b)bitnode *rchild(bitnode *b)int bitreedepth(bitnode *b)void visit(char ch)
/*先序遍歷二叉樹*/
void preorder(bitnode *b)}/*中序遍歷二叉樹*/
void inorder(bitnode *b)}/* 後序遍歷二叉樹*/
void postorder(bitnode *b)} void main()
printf("\n");
printf("(3)二叉樹b的深度為:%d\n",bitreedepth(b));
printf("(4)先序遍歷序列為:");
preorder(b);
printf("\n(5)中序遍歷序列為:");
inorder(b);
printf("\n(6)後序遍歷序列為:");
postorder(b);
printf("\n");}
13樓:呆啊呆啊呆
seek( 某一節點)
14樓:匿名使用者
#include
using namespace std;
#include
#include
#include
#define maxsize 20 //最大結點個數
//#define n 14 //必須輸入結點個數(包含虛結點)
#define m 10 //最大深度
typedef struct nodebitree;
bitree*q[maxsize];
bitree*creatree()
rear++;
q[rear]=s;
if(rear==1)
else
else
if(rear%2==1)
front++;
}//i++;
cin>>ch;
}return t;
}int countleaf(bitree* t)
int treedepth(bitree *t)
}void output(bitree*t) //輸出列印二叉數
cout
output(t->lchild );}} int menu_select( ) return sn; } int main( ) }return 0; } /*void main()*/ 15樓:匿名使用者 void inorder ( bitptr t )} include include define maxsize 100 typedef char datatype typedef struct node 二叉樹結點型別 bitree bitree q maxsize 用於建立二叉樹 bitree creatree 函式宣告 int depth bi... 根據 二叉樹的第i層至多有2 i 1 個結點 深度為k的二叉樹至多有2 k 1個結點 根結點的深度為1 這個性質 因為2 9 1 700 2 10 1 所以這個完全二叉樹的深度是10,前9層是一個滿二叉樹,這樣的話,前九層的結點就有2 9 1 511個 而第九層的結點數是2 9 1 256 所以第十... 1 求結點數的遞迴定義為 若為空樹,結點數為0 若只有根結點,則結點數為1 否則,結點數為根結點的左子樹結點數 右子樹結點數 1 2 求葉子數的遞迴定義為 若為空樹,葉子數為0 若只有根結點,則葉子數為1 否則,葉子數為根結點的左子樹葉子數 右子樹葉子數typedef char datatype 定...編寫非遞迴遍歷演算法,統計二叉樹的深度。各位請幫幫忙吧,急
具有結點的完全二叉樹的深度為,具有256個結點的完全二叉樹的深度為 。
急求關於二叉連結串列問題的演算法題,急求一個關於二叉連結串列問題的演算法題