树和图
樹和圖
說起樹的遍歷那肯定就會有兩種實現(xiàn)方法:遞歸和迭代。以前序為例就來小說幾句好了:
前序的遍歷順序是:根,左子樹,右子樹。
遞歸:
先遍歷根節(jié)點,
然后遍歷左子樹,
之后遍歷右子樹。
void preorderTravelsal(Node root){
if( root = null) return;
root.printValue();
preorderTravelsal(root.getLeft());
preorderTravelsal(root.getRight());
}
迭代(使用棧)
創(chuàng)建棧
將根節(jié)點壓入棧中
while棧非空
彈出一個節(jié)點,并輸出他的值
If 彈出節(jié)點有右子節(jié)點,將右子節(jié)點壓入棧
If 彈出接點有左子節(jié)點,將左子節(jié)點壓入棧
void preorderTravelsal(Node root){
NodeStack stack = new NodeStack();'
stack.push(root);
while( stack.size() > 0){
Node curr = stack.pop();
curr.printValue();
Node n =? curr.getRight();
if (n != null) stack.push(n);
n = curr.getLeft();
if(n != null) stack.push(n);
}
}
很明顯要用遞歸咯,樹的高等于其最高子樹的高加一。
一種思路:將兩個節(jié)點都生成其所有祖先節(jié)點的鏈表,然后在這兩個鏈表中搜索,找到第一個不同的節(jié)點的前一個節(jié)點即是所求。
另一種思路:二叉搜索樹的做子樹的節(jié)點的值都小于根節(jié)點,右子樹的節(jié)點的值都大于根節(jié)點。
If value1 和value2都小于當前節(jié)點的值
檢查左子節(jié)點
If value1和value2都大于當前節(jié)點的值
檢查右子節(jié)點
否則 當前節(jié)點就是所求節(jié)點
題目:給定一個存儲于無序的二叉樹中的整數(shù)集合。使用數(shù)組排序算法將這個樹轉(zhuǎn)化成為一個堆,這個堆使用的是平衡二叉樹的結(jié)構(gòu)。
總體思路?? 二叉樹->數(shù)組->堆
新建一個節(jié)點對象數(shù)組
遍歷二叉樹將節(jié)點存儲到數(shù)組中
對數(shù)組進行排序
For 每個i節(jié)點
Left = 2 * i +1
Rigjt = left + 1
If left長度小于數(shù)組長度,設置對應的Left節(jié)點為左子節(jié)點
If right長度小于數(shù)組長度,設置對應的right節(jié)點為右子節(jié)點。
?
轉(zhuǎn)載于:https://www.cnblogs.com/cnguoyu123/p/4475534.html
總結(jié)
- 上一篇: 5.1 四则运算
- 下一篇: jquery通过ajax提交form