非遞迴遍歷有點難,目前只能讀懂**,裡面的精髓還未真正參透。
先序遍歷:不斷地把根入棧,再取出來輸出
根左右, 那麼先入棧的肯定是根,要保證輸出左子樹,再輸出右子樹,那麼就要先入棧右子樹。
void preorderunrecur(node head)
if (node.left != null) }}
}
中序遍歷:必須左子樹走到底,才能取出來輸出,然後整體移動到右子樹進行void inorderunrecur(node head) else}}
}
後序遍歷:不斷地取棧,然後左右節點入棧。用第二個棧把頭節點存起來方便輸出
後序遍歷是 左 右 根 , 和先序遍歷的 根 左 右 其實只要根輸出位置變化了而已。利用棧把輸出序列儲存。
void posorderunrecur1(node head)
if (head.right != null)
}while (!stack2.empty()) }}
2、前驅後繼問題
後繼分兩步,第一步向下看, 第二步向上看。具體解釋在**裡
前驅分兩步,第一步向下看, 第二步向上看。
package zcy;
import org.junit.test;
import zcy.utils.printbinarytree;
public class preafttree
}// 獲取某結點的後繼
public node getsuccessornode(node node)
if (node.right != null) else
return parent;}}
public static node getleftmost(node node)
while (node.left != null)
return node;
}// 獲取某結點的前驅
public node getqian(node node)
if (node.left != null) else
return parent;}}
public static node getrightmost(node node)
while (node.right != null)
return node;
}@test
public void testfortree()
}
3、平衡二叉樹
左子樹和右子樹高度差不超過1
乙個辦法是求左右子樹的高度,然後進行判斷。 這樣有個問題,每個結點都會進入子樹進行求高度,log(n) ^2 。 我們可以這樣做,求高度的時候如果發現左右子樹高度差》1,那麼就返回-1,標明這棵樹不是平衡二叉樹。
public boolean isbalanced_solution(treenode root)
public int treedepth(treenode root)
4、搜素二叉樹
對於乙個根結點,左邊小於根,右邊大於根。中序遍歷,得到的序列是公升序的。
5、完全二叉樹
一層一層遍歷下來(用佇列儲存,左右入佇列,出佇列的順序就是按層遍歷)
解法:遇到這種情況1),直接false,
遇到情況2),後面遇到的結點都必須是葉子結點
舉個列子
//容易理解
if(l==null ||r==null)
}return true;
}6、 求完全二叉樹節點數
如果滿二叉樹: 2^n - 1
先求出樹的高度(一直向左),然後分兩種情況
1)如果根節點的右子樹的左子樹到達最後一層,那麼根節點的左子樹可以直接算出來(2^h -1), h表示左子樹的高度),再遞迴進去算右子樹。
2)如果根節點的右子樹的左子樹沒有到達最後一層,那麼右子樹可以直接算出來(2 ^h -1 ,h代表右子樹的高度)。再遞迴進去算左子樹。
時間複雜度計算
bs()方法總共會執行 o(logn)次, 因為每一層只有乙個結點會進入這個方法。然後每個結點求右子樹的左子樹能不能到達,也就是執行mostleftlevel,又耗費o(logn),因此複雜度是o(logn)^2。
// 傳入結點和結點所在的層, 和總高度
int bs(node node, int l, int h)
// 詢問當前結點的右孩子,的左孩子,能不能到達最底層
if (mostleftlevel(node.right, l + 1) == h) else
}// 傳入乙個結點和結點所在的層,返回向右走,能走到第幾層
int mostleftlevel(node head, int level)
return level-1;
}
左神演算法整理筆記05
桶排序對應的很多都是困難題哦 例子 對0 60的陣列進行排序 例子 對應leetcode 164 給定乙個陣列,求如果排序之後,相鄰兩數的最大差值,要求時間複雜度0 n 且要求不能用非基於比較的排序 public intmaximumgap int nums if max min boolean h...
左神演算法講堂筆記 06 Hash演算法
當通過put方法存入物件時,會呼叫key物件的hashcode 方法計算出hashcode,通過hashcode找到bucket位置儲存entry物件。獲取物件時,通過key計算出hashcode,找到bucket位置,hashmap採用鍊錶解決碰撞,因此遇到衝突時,就訪問bucket位置上鍊表的每...
左神演算法筆記01
對數器異或工具 一些其它的位運算子的操作 簡單理解為 將乙個演算法的所有操作拆成基本操作 常數時間完成的操作 後,計算出操作次數和操作時間 可視為1 的乘積,即操作次數之和。在考慮最差情況時用o 來表示時間複雜度,取最高項來表示。如o n o logn 對n個數進行排列,則最差要進行1 2 3 n ...