資料結構(七)二叉樹 的一些題目 遍歷 判斷

2021-09-18 03:48:38 字數 4043 閱讀 2886

以下是我學習二叉樹時做的一些題目的總結:

#include

#include

#include

#include

typedef

struct node node;

/*** @引數 in preorder: 儲存帶空('#')的前序序列陣列

* @引數 in size: 前序序列陣列可用長度

* @引數 out pused: 返回建立樹過程中使用的序列字元長度

** @返回 建立好的樹的根結點位址

*/// 使用給定序列構建二叉樹

node *

createtree

(char preorder,

int size,

int*pused)

else

if(preorder[0]

=='#'

)else

}void

test2()

// 小實驗

void

testaddress

(int n,

int*pused)

*pused = n *

1000

;testaddress

(n -

1, pused +3)

;}void

test1()

// 哪個可以還原二叉樹:

// 前序 + 後序 (不可以)

// 前序 + 中序 (可以)

// 後序 + 中序 (可以)

// 前序 找根最方便 preorder[0]

// 後序 找根最方便 preorder[size - 1]

// 中序 分割左右子樹最方便

// 1.前序 + 中序 還原樹

intfind

(char array,

int size,

char v)

}return-1

;}node *

buildtree

(char preorder,

char inorder,

int size)

char rootvalue = preorder[0]

;int leftsize =

find

(inorder, size, rootvalue)

;// 找前序根在中序的位置

// 根

node *root =

(node *

)malloc

(sizeof

(node));

root->value = rootvalue;

// 左子樹

root->left =

buildtree

(preorder +

1, inorder, leftsize)

;// 右子樹

root->right =

buildtree

(preorder +

1+ leftsize, inorder + leftsize +

1, size -

1- leftsize)

;return root;

}void

test3()

// 2.中序 + 後序 還原樹

intfind2

(char array,

int size,

char value)

}return-1

;}// inorder d b e h a f c g

// postorder d h e b f g c a

node *

buildtree2

(char inorder,

char postorder,

int size)

char rootvalue = postorder[size -1]

;int leftsize =

find2

(inorder, size, rootvalue)

;// 找後序根在中序的位置

//根 node *root =

(node *

)malloc

(sizeof

(node));

root->value = rootvalue;

//左子樹

root->left =

buildtree2

(inorder, postorder, leftsize)

;//右子樹

root->right =

buildtree2

(inorder + leftsize +

1, postorder + leftsize, size -

1- leftsize)

;return root;

}#include

// 層序遍歷

void

levelorder

(node *root)

// 啟動

std:

:queue> q;

q.push

(root)

;while

(!q.

empty()

)if(front->right !=

null)}

printf

("\n");

}void

test4()

// 判斷二叉樹是否是 完全二叉樹

bool iscomplete

(node *root)

// 層序遍歷,空結點也進佇列

q.push

(front->left)

; q.

push

(front->right);}

// 判定佇列中剩餘資料是否全是 null

while

(!q.

empty()

)}// 所有都是 null

return true;

}void

test5()

else

}// 非遞迴實現前序

// 遞迴缺點: 1.控制力度差 2.調整棧的大小比較麻煩(只能編譯期間調整)

// 非遞迴 自定義的棧 + 迴圈

#include

// 非遞迴的二叉樹寫法(用棧寫)

// 1.(前序遍歷)

void

preordernor

(node *root)

node *top = s.

top(

); s.

pop();

cur = top->right;}}

void

test6()

// 2.(中序遍歷)

void

inordernor

(node *root)

node *top = s.

top(

); s.

pop();

printf

("%c "

, top->value)

;// 把列印的語句加到這裡就可以了

cur = top->right;}}

// 3.(後序遍歷)

void

postordernor

(node *root)

node *top = s.

top();

// 我不知道是第二次遇到還是第三次遇到

if(top->right ==

null

)else

if(top->right == last)

else}}

// 二叉搜尋樹轉成有序雙向鍊錶

node *prev =

null

;// 保證按有序的順序呼叫該函式

void

nodetodoublylink

(node *node)

prev = node;

}void

inorder

(node *root)

}

每日一題(七) 二叉樹遍歷

二叉樹的前序 中序 後序遍歷的定義 前序遍歷 對任一子樹,先訪問根,然後遍歷其左子樹,最後遍歷其右子樹 中序遍歷 對任一子樹,先遍歷其左子樹,然後訪問根,最後遍歷其右子樹 後序遍歷 對任一子樹,先遍歷其左子樹,然後遍歷其右子樹,最後訪問根。題目 給定一棵二叉樹的前序和中序遍歷,求其後續遍歷。樣例輸入...

資料結構(八)二叉樹遍歷

二叉樹是一種樹形結構,遍歷就是要讓樹中的所有節點被且僅被訪問一次,即按一定規律排列成乙個線性佇列。二叉 子 樹是一種遞迴定義的結構,包含三個部分 根結點 n 左子樹 l 右子樹 r 根據這三個部分的訪問次序對二叉樹的遍歷進行分類,總共有6種遍歷方案 nlr lnr lrn nrl rnl和lnr。研...

《戀上資料結構與演算法》筆記(七) 二叉樹

二 二叉樹 三 leetcode演算法題 跳轉到目錄 跳轉到目錄 跳轉到目錄 跳轉到目錄 跳轉到目錄 節點的高度 從當前節點到最遠葉子節點的路徑上的節點總數。樹的深度 所有節點深度的最大值。樹的高度 所有節點高度的最大值。跳轉到目錄 跳轉到目錄 跳轉到目錄 跳轉到目錄 a 真二叉樹 跳轉到目錄 b ...