二叉樹的相關的各種題目

2021-09-27 07:10:11 字數 4147 閱讀 8780

二叉樹是每個結點最多有兩個子樹的樹結構。通常子樹被稱作「左子樹」(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 二叉樹中是否...