二叉樹是每個結點最多有兩個子樹的樹結構。通常子樹被稱作「左子樹」(left subtree)和「右子樹」。一棵深度為k,且有(2^k)-1個結點的二叉樹,稱為滿二叉樹。最少結點為k,為斜二叉樹。
了解了什麼是二叉樹後,自然要懂得它的三種遍歷方法。前序(先序):中 -> 左 -> 右、中序:左 -> 中 -> 右、後序:左 -> 右 -> 中。(中是父節點,左是左節點,右是右節點)
先序
public static void preorder(treenode root)
中序
public static void inorder(treenode root)
後序
public static void postorder(treenode root)
先序
public static void preorder(treenode root)
root=root.pop(); //取出棧頂元素
root =root.right; //遍歷右孩子
}}
中序
public static void inorder(treenode root)
system.out.println(root.val);
root=root.pop(); //取出棧頂元素
root =root.right; //遍歷右孩子
}}
後序
public static void postorder(treenode root)
root=root.peek().right; //peek是指向棧頂元素, 查詢元素右節點
if(root==null)
}}
對於非遞迴版的遍歷方法,需要大家新建棵樹去每一步的認真走一下流程,這樣才能真正的理解,不至於死記硬背。我寫的非遞迴版的都是利用棧這種資料結構,它和js中陣列一樣,這樣的話大家理解起來也比較容易。
深度優先遍歷,也是利用棧來儲存資料進行操作的。
//二叉樹深度優先
* 1
* / \
* 2 3
* / \ /\
* 4 5 6 7
* 結果是:1,2,4,5,3,6,7
public static void getdfs(treenode root)
stack stack = new stack ();
stack.push(root);
while(!stack.empty())
}
廣度優先是值先列印根節點,然後依次列印左節點和右節點(是指同一層次中的所有節點)
//二叉樹廣度優先
* 1
* / \
* 2 3
* / \ /\
* 4 5 6 7
* 結果是:1,2,3,4,5,6,7
//**實現
public static void getbfs(treenode root)
queuequeue = new linkedlist();
queue.offer(root);
while(!queue.isempty() || root!=null)
if(node.right!=null)
}}
二叉搜尋樹的特點是根節點大於左孩子,小於右孩子。
*4*
/ \ *26
*/ \ / \
*1357
* 結果是:1,2,3,4,5,6,7
** 主要是利用中序遍歷,在彈出棧的時候記錄count是否和 k 相等。
*public
static
void
kthnode
(treenode root,int k)
count++
;//計數
if(count==k)
return root;
//進行比較
root = stack.
pop();
root = root.right;
}}
使用遞迴來實現,首先需要了解的問題是:
根結點是第0層,所以當 k<0 時返回 0
k=0 時,只有乙個根結點,應該返回 1
k>0 時,遞迴求 k-1 層左右結點個數相加
public int k_nodes
(int k)
private int knodes
(treenode root,int k)
滿足的和為k的路徑是:最後乙個結點要為葉子結點並且和等於k。
在這我們會利用棧來儲存滿足的路徑,最後遍歷棧列印輸出路徑。
*4*
/ \ *25
*/ \ *1
3* 若k=
9 滿足的兩條路徑是:4,2
,3 和 4
,5 這兩條路徑
*public
class
sumk
(treenode root,int k)
system.out.
println()
;}findpath
(srack,root.left,k)
;//遍歷左節點
findpath
(stack,root.right,k)
;//遍歷右節點
stack.
pop();
//如果當前遍歷節點為葉子節點,並且k!=0 把當前節點從棧頂彈出
}}
//這題是leetcode上的題目,可以去看看,自己做做
class
solution
void
allpaths
(stack stack,treenode root,string str)
str+=root.val;
if(root.left==
null
&& root.right==
null)if
(root.left!=
null
)allpaths
(stack,root.left,str+
"->");
if(root.right!=
null
)allpaths
(stack,root.right,str+
"->");
}}// ["1->2->3","1->5"]
額外的js簡單程式設計題:
實現解析瀏覽器中url引數/*最後 結果
*/url = 『
function parseparam(url) ;
var data=url.split('?')[1]; //若沒有指定url,可以使用window.location.search
var arr=data.split('&'); //分割後,儲存到陣列中
for(let i=0;i斐波那契數列我想大家肯定都了解,之前寫的時候可能會直接用遞迴和陣列儲存,這兩種呢會消耗大量的記憶體空間,因為它儲存了重複計算的值。
上次面試的時候被問到如何進行優化數列,下面就來講講優化的方法。
function fibo(n)else
return b;
}}
以上是本篇部落格為大家分享的知識點,每天進步一點點。希望和大家一起進步? 二叉樹的相關題目
目錄 1 求二叉樹的遍歷順序為自下至上,自右至左的層序遍歷序列 2 判斷二叉樹是否為完全二叉樹 3 統計二叉樹中雙分支結點的個數 4 求先序遍歷序列中第k個結點的值 5 求二叉樹的高度 6 判斷二叉樹是否為二叉排序樹 7 求出二叉排序樹中結點所在的層數 演算法思想 使用層序遍歷。二叉樹正常的層序遍歷...
LeetCode 二叉樹相關題目
class solution private 遞迴的方法 void inorder treenode root,vector int nodes inorder root left,nodes nodes.push back root val inorder root right,nodes 非遞迴...
6 二叉樹相關題目
目錄 nc5 二叉樹根節點到葉子節點和為指定值的路徑 思路 先序遍歷的思想 根左右 數字求和 每一層都比上層和 10 當前根節點的值 nc6 二叉樹的最大路徑和 思路1 遞迴樹的節點 思路2 層序遍歷 nc8 二叉樹根節點到葉子節點和為指定值的路徑 思路 樹的深度優先遍歷dfs nc9 二叉樹中是否...