以下是我學習二叉樹時做的一些題目的總結:
#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 ...