C的回歸基礎學習 資料結構(4)樹 1 臨時

2021-09-29 15:57:56 字數 3182 閱讀 9590

終於到樹了乙個虐人虐得不要不要但是你又總會驚嘆前任大佬們的天才想法。總之,慢慢來吧。

先說一般的樹就是沒任何特點的,實現這種樹你甚至可以用圖的實現方法,基本上我不知道與其有關的用法。

二叉樹很強,很多樹高階的樹都是二叉樹。因為要求不一樣有時建樹的需求不一樣,既可以陣列建樹也可指標建樹。

struct node

;struct nodetree[n]

;//n為節點數

至於如何建樹得看資料給的怎麼樣。

層序遍歷我在佇列時打過了,直接上剩下三個**

#include

#define n 2<<9

using

namespace std;

struct nodetr[n]

;void

dfs1

(int now)

void

dfs2

(int now)

void

dfs3

(int now)

intmain()

dfs1(1

);//先序遍歷

printf

("\n");

dfs2(1

);//中序遍歷

printf

("\n");

dfs3(1

);//後序遍歷

//先後中是指處理根節點的位置

return0;

}

一道與二叉樹遍歷有關的題

leetcode101.對稱的二叉樹

給定乙個二叉樹,檢查它是否是映象對稱的。

例如,二叉樹 [1,2,2,3,4,4,3] 是對稱的。

1

/ \ 2

2/ \ / \34

43

但是下面這個 [1,2,2,null,3,null,3] 則不是映象對稱的:

1

/ \2

2 \ \

33

分析:

1.遞迴法:

bool

dfs(treenode* l,treenode* r)

bool

issymmetric

(treenode* root)

和題解比較後,這裡多說幾句:

2.迭代法:

思路一樣,只是操作我沒有見過所以想要學一下。

此處使用佇列實現迭代,每次從佇列裡抽出兩個點,如果相同就把他們的四個子節點按照映象對應的方式存進去,一旦隊列為空或者有不同就結束。

bool

issymmetric

(treenode* root)

return

true

;}

#include

#include

using

namespace std;

inline

void

swap

(int

& a,

int& b)

struct heap

void

insert

(int num)

return;}

inttop()

void

pop(

)else

break;}

}}h;

intmain()

for(

int i =

0;i < n;i++

)return0;

}

二叉搜尋樹顧名思義,是與二叉搜尋有著緊密聯絡的樹,有:

定義二叉搜尋樹是一種節點值之間具有一定數量級次序的二叉樹,對於樹中每個節點:

一道相關題目

leetcode題號:96. 不同的二叉搜尋樹

給定乙個整數 n,求以 1 … n 為節點組成的二叉搜尋樹有多少種?

先不急著搞二叉搜尋樹的實現,先做一道與二叉搜尋樹有關的題。

其實這題是個遞推(也算dp),定義f[i]為i個不同的數可以組成二叉搜尋樹的個數。其次我們得知道乙個二叉搜尋樹的子樹也是二叉搜尋樹。最後我們定義乙個空樹也是一顆二叉搜尋樹發f[0] = 1。

所以對於乙個數n我們考慮:

#include

using

namespace std;

intmain()

printf

("%d"

,f[n]);

return0;

}

又一道有關的題

leetcode題號: 99. 恢復二叉搜尋樹

二叉搜尋樹中的兩個節點被錯誤地交換。

請在不改變其結構的情況下,恢復這棵樹。

例子

輸入:[1

,3,null,null,2]

1/3 \

2輸出:[3,

1,null,null,2]

3/1 \

2

分析:

這道題真的需要對搜尋樹有一定的了解,不然連題都讀不懂(比如我)

劃重點:乙個二叉搜尋樹的中序遍歷是單調遞增的

所以只需要中序遍歷一遍就知道那兩個錯誤的點了,然後注意一下交換的操作

treenode* w1;

treenode* w2;

treenode* pre =

null

;void

dfs(treenode* root)

else

} pre = root;

dfs(root-

>right);}

void

recovertree

(treenode* root)

這道題可能難的地方是這個吧

高階:這點點東西只是冰山一角。

爬樹之旅任重而道遠。。。。

資料結構 樹的學習 (1)

樹的概念 樹是n n 0 個結點的有限集,n 0 是稱為空樹,在任意一顆非空樹中 1 有且僅有乙個特定的稱為根的結點,2 當n 1時,其餘節點可分為m個互不相交的有限集,每個集合本身又是一棵樹,並且稱為根的子樹。結點分類 結點擁有的子樹數稱為結點的度。度為0的結點稱為葉結點或終端結點,度不為0的結點...

資料結構(C)樹(1)

1.概念與性質 樹是一種非線性結構,與前面的鍊錶棧與佇列 線性結構 不同。樹 tree 是由n n 0 個節點構成的有限集合。當n 0,就為空樹。當n 0,必有乙個樹根 root 除了樹根,其餘的節點可以劃分為很多個子集,也叫子樹。樹的邊說有方向性的,只能從樹根指向某一節點,只能從上到下 有且只有一...

資料結構(C )樹的基礎

樹 n n 0 個結點的有限集合。當n 0時,稱為空樹 任意一棵非空樹滿足以下條件 有且僅有乙個特定的稱為根的結點 當n 1時,除根結點之外的其餘結點被分成m m 0 個互不相交的有限集合t1,t2,tm,其中每個集合又是一棵樹,並稱為這個根結點的子樹。樹的定義採用遞迴方法 結點的度 結點所擁有的子...