有4種遍歷二叉樹的常用方法:
前序遍歷
void
preorder
(binarytreenode
*t)//遞迴版
}
迭代使用棧來實現前序遍歷
void
preorderiter
(treenode* root)
//迭代版
stack> stack;
stack.
push
(root)
;while
(!stack.
empty()
)if(top-
>left!=
null)}
}
中序遍歷void
inorder
(binarytreenode
*t)//遞迴
}
先把root、以及root左孩子都壓入棧中
棧頂出棧並訪問,把棧頂的右孩子作為新的根節點
void
inorderiter
(treenode* root)
//迭代
while
(!stack.
empty()
|| root!=
null
)auto top = stack.
top();
stack.
pop();
cout << top-
>val <<
" ";
root = top-
>right;
}}
後序遍歷void
postorder
(binarytreenode
*t)//遞迴
}
迭代使用棧來實現後序遍歷
vector<
int>
postorderiter
(treenode* root)
//迭代
stack> stack;
stack.
push
(root)
;while
(!stack.
empty()
)if(top-
>right !=
null)}
reverse
(result.
begin()
, result.
end())
;//反轉容器
return result;
}
visit函式void
visit
(binarytreenode
*x)
層次遍歷void
levelorder
(binarytreenode
*t)catch
(queueempty)
q.pop();
}}
僅當樹非空時,才進入while迴圈。進入while迴圈後,首先訪問根節點,再把其子節點(如果有)加到佇列中,然後訪問隊首元素。若隊列為空,則front()丟擲乙個型別為queueempty的異常;若佇列不為空,則front()的返回值指向隊首元素指標,下一次迴圈將訪問這個元素。 樹的相關知識回顧
樹的資料結構相對來說也比較好理解。但由於為了查詢效率和儲存效率,又有多種樹形結構,對樹進行了限制。如二叉樹,平衡二叉樹,紅黑樹,b樹,b 樹。其實也沒多少多複雜,只是願不願意花時間去研究。個人花了點花時間回顧了一下平衡二叉樹和二叉樹的理論和實現。紅黑樹和b樹,b 樹暫時沒有去研究。後續有空了再補。只...
樹相關知識(補充)
1 二叉樹的主要性質 6 1 非空二叉樹上葉子結點數等於雙分支結點數加1 a 總結點數 度為2的結點 度為1的結點 度為0的結點 b 總結點數 度為2的結點數 2 度為1的結點 1 由公式ab得出 度為0的結點等於度為2的結點 1 2 二叉樹的第i層最多有2的i 1次方的結點。等比數列 3 高度 或...
C 之類的相關知識
一 函式模板 過載 引數個數不同,型別不同可以構成過載 將資料型別當引數進行傳遞 將資料型別和演算法進行分離 函式模板 用template去宣告模板 模板宣告只對dang當前函式有效 1.myswap a,b 隱式呼叫 不指名型別 讓編譯器自動推導 cout 標準輸出流變數 2.函式模板可以隱式呼叫...