目錄完全二叉查詢樹建樹
方式二序列轉換
後序中序轉前序
二叉查詢樹前序轉後序
如何進行層級遍歷序列?
如何記錄層級?
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 ...