演算法筆記 樹 DFS BFS相關問題解決方案整理

2022-06-29 17:03:11 字數 2651 閱讀 1671

目錄完全二叉查詢樹建樹

方式二序列轉換

後序中序轉前序

二叉查詢樹前序轉後序

如何進行層級遍歷序列?

如何記錄層級?

bfs中如何記錄層級?如何記錄每層葉子節點數?

如何判斷樹是否為完全二叉樹

dfs使用root左右指標建立樹節點關係,返回根節點root

dfs使用二維陣列,int nds[n][2],如:nds[i][0]表示i節點的左子節點,nds[i][1]表示i節點的右子節點

dfs使用鄰接表儲存樹節點關係,vectornds[n],如:nds[i][j]表示節點i的子節點j

如前序序列:8 6 5 7 10 8 11

8是根節點

左子樹:從6開始往後找小於8的都為8的左子樹節點

右子樹:從最後一位11開始往前找大於8的都為8的右子樹節點

繼續遞迴過程,直到完成建樹

node * create(int prel,int prer)
非遞迴
node * root;

void insert(int n)

node * p=root;

while(p!=null)

else p=p->right;

} else

else p=p->left;}}

}

遞迴
void insert(node* &root, int data, int dep) 

if(data <= root->data) insert(root->left, data, root->h+1); //插在左子樹

else insert(root->right, data, root->h+1); //插在右子樹

}

完全二叉查詢樹,任意節點序列建樹

注:二叉查詢樹(不一定要完全二叉樹)任意節點序列,公升序排序,即為二叉查詢樹的中序序列

方式一:模擬遞迴列印中序序列的過程,將中序序列依次插入到陣列建樹

方式二:找root在中序序列中的位置k並將root儲存到陣列,遞迴處理startk-1左子樹和k+1end右子樹,完成建樹

void inorder(int root)
void getlevel(int start, int end, int index)
後序倒數第乙個節點為根root,root在前序中為第乙個節點

後序倒數第二個節點為root的右子樹的根節點righttreeroot,righttreeroot在前序中將序列分為左邊部分(root和root的左子樹),右邊部分(root的右子樹包含righttreeroot)

若righttreeroot前只有乙個節點,那麼說明該righttreeroot的父節點root只有乙個子節點,即righttreeroot既可以為root的左子節點也可以為root的右子節點

node * create(int prel,int prer,int postl,int postr)  else 

return root;

}

前序第乙個節點為根root,root在中序中位置為k,將序列分為左邊部分(root的左子樹),右邊部分(root的右子樹)

inlk-1為下次左遞迴的後序序列,其對應的後序序列為prel+1prel+(k-inl);

k+1inr為下次遞迴的後序序列,其對應的後序序列為postl+(k-inl)+1prer;

void postfirst(int inl,int inr, int prel,int prer) 

int numleft=i-inl;

root->left=create(postl,postl+numleft-1,inl,inl+numleft-1);//inl+numleft=i

root->right=create(postl+numleft,postr-1,inl+numleft+1,inr);//inl+numleft=i

return root;

}

pat a1127 zigzagging on a tree (30分)

二叉查詢樹前序序列

void getpost(int root, int tail)  else 

for(int i=0; iq;

root->depth=0;

q.push(root);

while(!q.empty())

if(now->right!=null)

}}

使用int h[n]記錄節點層級,如:h[i]即為節點i的層級,使用int max_h記錄最大層數方便後續層級遍歷,可使用int leaf[n]記錄對應層級葉子節點數

void bfs() else{

for(int i=0;i陣列儲存樹(節點index=i,左右子節點index分別為2i+1,2i+2),判斷陣列中間是否有空閒位置

陣列儲存樹(節點index=i,左右子節點index分別為2i+1,2i+2),最大index==結點數n-1即為完全二叉樹

bfs借助佇列廣度優先遍歷,若遇到null則為非完全二叉樹,因為完全二叉樹在借助佇列bfs遍歷時,中間不可能出現null

演算法筆記 DFS BFS

深度優先搜尋 dfs void dfs if 越界或者是不合法狀態 return if 特殊狀態 剪枝 return for 擴充套件方式 dfs 幾道題目 推薦做一下 例項1 全排列加素數 已知 n 個整數b1,b2,bn 以及乙個整數 k k n 從 n 個整數中任選 k 個整數相加,可分別得到...

演算法筆記 問題 A 樹查詢

題目描述 有一棵樹,輸出某一深度的所有節點,有則輸出這些節點,無則輸出empty。該樹是完全二叉樹。輸入輸入有多組資料。每組輸入乙個n 1 n 1000 然後將樹中的這n個節點依次輸入,再輸入乙個d代表深度。輸出輸出該樹中第d層得所有節點,節點間用空格隔開,最後乙個節點後沒有空格。樣例輸入 copy...

演算法題 樹相關

題目 給定乙個二叉樹,找出其最大深度。二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。方法1 遞迴 class solution def maxdepth self,root type root treenode rtype int if root is none return 0else ...