二叉樹學習

2021-04-20 07:21:28 字數 1599 閱讀 9687

二叉樹的遞迴思想是一大難點。自認為是容易遺忘的東西。

簡單問題:

求n!, result = n*(n-1)*(n-2)......1

自然迴圈可以解決問題

int i,result;

result = n;

for (i=n-1; i>0; i--)

遞迴的寫法就是:

int fibonacci1(int n)

}很明顯的特點是:

1.有乙個退出函式的條件.

2.重複呼叫自身,並每次變化引數.

這裡如果n == 1,就不再呼叫自身,直接return;否則將n-1作為引數繼續呼叫自身。

數學的表示式應該是:

f(n) = n*f(n-1) = n*(n-1)*f(n-2) = n*(n-1)*(n-2)*....*1;

程式的理解:

呼叫f(6)

return 6*f(5)  ---> 呼叫f(5)

^-------  return 5*f(4) ----> 呼叫f(4)

^-------- return 4*f(3) ----> 呼叫f(3)

^-------- return 3*f(2) -----> 呼叫f(2)

^--------  return 2*f(1) ----> 呼叫f(1)

^-------return 1;

整個過程就是這樣的,因為函式呼叫會出現新的堆疊,返回再恢復堆疊,效率沒有非遞迴高(我知道但感受不到^_^).

二叉樹的建立:

定義:typedef

struct node

node, *pnode;

建立:void create(pnode &t)

}注意create函式的引數,可以參看本blog的兩種傳遞位址方法

呼叫方法:

int _tmain(int argc, _tchar* argv)

輸入順序: 12

3-1-14

-1-15-1

-1過程如下:

create(root)

d = 1      -> root = 新節點

root->data = d;

create(root->lchild); -> d=2; 

create(root->rchild);    root->lchild = 新節點

root->lchild->data = d;

create(root->lchild->lchild); -> d=3;

create(root->lchild->rchild);    root->lchild->lchild = 新節點

root->lchild->->lchild->data = d;

create(root->lchild->lchild->lchild);

create(root->lchild->lchild->rchild);

從這裡d=-1;

root->lchild->lchild->lchild = null;

ok,有機會畫個流程圖就更清楚了。

二叉樹 二叉樹

題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...

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

目錄名稱作用根 樹的頂端結點 孩子當遠離根 root 的時候,直接連線到另外乙個結點的結點被稱之為孩子 child 雙親相應地,另外乙個結點稱為孩子 child 的雙親 parent 兄弟具有同乙個雙親 parent 的孩子 child 之間互稱為兄弟 sibling 祖先結點的祖先 ancesto...

二叉樹學習

最近有了大把的時間,學習了資料結構,在大學的時候就接觸過資料結構,在現在那時只不過是為了考乙個二級證,那時的概念只是背,但是一直不理解解,還好,我打算重走這段歷史。回歸正題 二叉樹的概念 二叉樹是n n 0 個結點的有限集合,該集合或者為空集 成為空二叉樹 或者由乙個節點和兩棵不互相交的,分別稱為根...