左神演算法講堂筆記 05 樹

2021-09-11 03:52:36 字數 3292 閱讀 1204

非遞迴遍歷有點難,目前只能讀懂**,裡面的精髓還未真正參透。

先序遍歷:不斷地把根入棧,再取出來輸出

根左右, 那麼先入棧的肯定是根,要保證輸出左子樹,再輸出右子樹,那麼就要先入棧右子樹。

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 ...