1. 程式人生 > >二叉樹的深度(遞迴和非遞迴)---java實現

二叉樹的深度(遞迴和非遞迴)---java實現

遞迴實現

為了求樹的深度,可以先求其左子樹的深度和右子樹的深度,可以用遞迴實現,遞迴的出口就是節點為空。返回值為0

非遞迴實現

利用層次遍歷的演算法,設定變數level記錄當前節點所在的層數,設定變數last指向當前層的最後一個節點,當處理完當前層的最後一個節點,讓level指向+1操作。設定變數cur記錄當前層已經訪問的節點的個數,當cur等於last時,表示該層訪問結束。

層次遍歷在求樹的寬度、輸出某一層節點,某一層節點個數,每一層節點個數都可以採取類似的演算法。

樹的寬度:在樹的深度演算法基礎上,加一個記錄訪問過的層節點個數最多的變數max,在訪問每層前maxlast比較,如果max比較大,

max不變,如果max小於last,把last賦值給max;

程式碼:

import java.util.LinkedList;

public class Deep
{
	//遞迴實現1
  public int findDeep(BiTree root)
  {
	  int deep = 0;
	  if(root != null)
	  {
		  int lchilddeep = findDeep(root.left);
		  int rchilddeep = findDeep(root.right);
		  deep = lchilddeep > rchilddeep ? lchilddeep + 1 : rchilddeep + 1;
	  }
	  return deep;
  }
  
  
  //遞迴實現2
  public int findDeep1(BiTree root)
  {
	
	  if(root == null)
	  {
		  return 0;
	  }
	  else
	  {
	   int lchilddeep = findDeep1(root.left);//求左子樹的深度
	   int rchilddeep = findDeep1(root.left);//求右子樹的深度
	   return lchilddeep > rchilddeep ? lchilddeep + 1 : rchilddeep + 1;//左子樹和右子樹深度較大的那個加一等於整個樹的深度
	  }
  }
  
  
  //非遞迴實現
  public int findDeep2(BiTree root)
  {
	 if(root == null)
		 return 0;
	
	 BiTree current = null;
	 LinkedList<BiTree> queue = new LinkedList<BiTree>();
	 queue.offer(root);
	 int cur,last;
	 int level = 0;
	 while(!queue.isEmpty())
	 {
		 cur = 0;//記錄本層已經遍歷的節點個數
		 last = queue.size();//當遍歷完當前層以後,佇列裡元素全是下一層的元素,佇列的長度是這一層的節點的個數
		 while(cur < last)//當還沒有遍歷到本層最後一個節點時迴圈
		 {
			 current = queue.poll();//出隊一個元素
			 cur++;
			 //把當前節點的左右節點入隊(如果存在的話)
			 if(current.left != null)
			 {
				 queue.offer(current.left);
			 }
			 if(current.right != null)
			 {
				 queue.offer(current.right);
			 }
		 }
		 level++;//每遍歷完一層level+1
	 }
	 return level;
  }
  public static void main(String[] args)
 {
	BiTree root = BiTree.buildTree();
	Deep deep = new Deep();
	System.out.println(deep.findDeep(root));
	System.out.println(deep.findDeep1(root));
	System.out.println(deep.findDeep2(root));	
 }
}
樹的結構

                   A

             /              \

           B               C

         /    \                 \

       D     E               G

相關推薦

深度Depth``與``

二叉樹 (`Depth`)遞迴 深度優先遍歷 DFS 二叉樹的高度(深度)為二叉樹結點層次的最大值,也可以認為在根節點不為 nullptr 的情況下左右子樹的最大高度 + 1; 先序(後序)遍歷求解二叉樹高度(Depth)的遞迴演算法 演算法描述:深度優先遍歷 

三種遍歷的思路JAVASCRIPT)

二叉樹在圖論中是這樣定義的:二叉樹是一個連通的無環圖,並且每一個頂點的度不大於3。有根二叉樹還要滿足根結點的度不大於2。有了根結點之後,每個頂點定義了唯一的父結點,和最多2個子結點。然而,沒有足夠的資訊來區分左結點和右結點。如果不考慮連通性,允許圖中有多個連通分

深度優先遍歷廣度優先遍歷

因此 怎麽 code ron inf 技術 廣度優先搜索 二叉樹的遍歷 eat 對於一顆二叉樹,深度優先搜索(Depth First Search)是沿著樹的深度遍歷樹的節點,盡可能深的搜索樹的分支。以上面二叉樹為例,深度優先搜索的順序為:ABDECFG。怎麽實現這個順序

python 的中序遍歷方法

# class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = N

--後序遍歷的演算法

後續遍歷關鍵在於,當節點的  右子樹存在且被訪問後  或者是  右子樹為空  才能訪問自身。 在遍歷過程中,先將節點從的左孩子到最左節點壓棧, 設定標誌變數 flag 來判斷是否訪問過左孩子, pre指標來指向先前訪問過的節點。 所有左孩子壓棧後, 最後一個節點的左孩子為空,已被訪問p = NULL , 令f

的三種遍歷實現

1.二叉樹前序遍歷的非遞迴實現      * 實現思路,先序遍歷是要先訪問根節點,然後再去訪問左子樹以及右子樹,這明顯是遞迴定義,但這裡是用棧來實現的      * 首先需要先從棧頂取出節點,然後訪問該節點,如果該節點不為空,則訪問該節點,同時把該節點的右子樹先入棧,然後 

演算法學習之實現結點及其層數的輸出

背景 這半年在準備考研,所以沒有對技術棧進行更新或複習,部落格也沒有更新……但上週學院宣佈畢業設計(企業實習)開題了,要找老師找單位,這才不得不犧牲晚上下軍棋的時間,複習或學習程式設計的知識……   今天記錄一下解決這個問題: 非遞迴實現二叉樹的遍歷,以及輸出每一個結點和其

【LeetCode】144. Binary Tree Preorder Traversal 先序遍歷的實現

題目: 翻譯:給定一個二叉樹,返回先序遍歷的序列。 分析:二叉樹的先序遍歷、中序遍歷及後序遍歷演算法是資料結構中最基礎的遍歷演算法。             先序遍歷:先訪問根節點的資料,再訪問左孩子節點的資料,最後訪問右孩子節點的資料。圖中例子先序遍歷輸出的序列為:【

的後序遍歷演算法

非遞迴思想: 由後序的  左右根 的順序來,不過二叉樹的定義本身就是一個遞迴的思想,只需要在對一個結點訪問之前先將該結點放入到棧中去,並依次將該結點的左孩子也放入到棧中 任意一個結點N,只要他有左孩子

的先序遍歷(演算法)

思路一:主要思想就是先將根結點壓入棧,然後根結點出棧並訪問根結點,而後依次將根結點的右孩子、左孩子入棧,直到棧為空為止。 void PreOrder2(BTree T) { if(!T) return; LinkStack s; InitStack(&

JAVA語言實現的層次遍歷的演算法及演算法

/** 二叉樹節點 */ public class BTNode {   private char key;   private BTNode left, right;   public BTNode(char key) {     this(key, null, null

的三種遍歷實現

statistic 結束 定義 style 思路 system 兩個 tor tool 1.二叉樹前序遍歷的非遞歸實現 * 實現思路,先序遍歷是要先訪問根節點,然後再去訪問左子樹以及右子樹,這明顯是遞歸定義,但這裏是用棧來實現的 *

時間複雜度分析及增刪改查操作java實現

順序表和連結串列的時間複雜度由給定條件不同從而會得出不同的時間複雜度結果,對於程式設計時並不總是最好用的儲存方式。二叉樹是一種更加穩定的資料儲存方式,其複雜度總是能表示為一個固定的形式。以下來分析二叉樹增刪改查操作做的時間複雜度。 設有如下資料需要進行二叉樹形式儲存:

的常見方法及三種遍歷方式 Java 實現

讀完本文你將瞭解到: 樹的分類有很多種,但基本都是 二叉樹 的衍生,今天來學習下二叉樹。 什麼是二叉樹 Binary Tree 先來個定義: 二叉樹是有限個節點的集合,這個集合可以是空集,也可以是一個根節點和至多兩個子二叉樹組成的集合,其中一顆樹叫做根的左子樹,另一棵叫做根的右子樹。

深度---java實現

遞迴實現 為了求樹的深度,可以先求其左子樹的深度和右子樹的深度,可以用遞迴實現,遞迴的出口就是節點為空。返回值為0; 非遞迴實現 利用層次遍歷的演算法,設定變數level記錄當前節點所在的層數,設定變數last指向當前層的最後一個節點,當處理完當前層的最後一個節點,讓lev

的前中後序遍歷版本

各位讀者週末愉快呀,今天我想來說說一道很常見的面試題目 —— 關於二叉樹前中後序遍歷的實現。本文將以遞迴和非遞迴方式實現這 3 種遍歷方式,程式碼都比較短,可以放心食用。 先簡單說明一下這 3 種遍歷方式有什麼不同 —— 對於每種遍歷,樹中每個結點都需要經過 3 次(對於葉結點,其左右子樹視為空子樹),但前

【演算法】遍歷

原文地址 【寫在前面】   二叉樹是一種非常重要的資料結構,很多其它資料結構都是基於二叉樹的基礎演變而來的。對於二叉樹,有前序、中序以及後序三種遍歷方法。因為樹的定義本身就 是遞迴定義,因此採用遞迴的方法去實現樹的三種遍歷不僅容易理解而且程式碼很簡潔。而對於樹的遍歷若採用非遞迴的方法,就要採

資料結構實驗-C語言-二叉樹的建立,前、中、後序遍歷的遞迴演算法和非遞迴演算法,求葉子結點數目,求二叉樹深度,判斷二叉樹是否相似,求二叉樹左右子互換,二叉樹層序遍歷的演算法,判斷二叉樹是否是完全二叉樹

1.實驗目的 熟練掌握二叉樹的二叉連結串列儲存結構的C語言實現。掌握二叉樹的基本操作-前序、中序、後序遍歷二叉樹的三種方法。瞭解非遞迴遍歷過程中“棧”的作用和狀態,而且能靈活運用遍歷演算法實現二叉樹的其它操作。 2.實驗內容 (1)二叉樹的二叉連結串列的建立 (2)二叉樹的前、中、後

中葉子結點的個數的方式實現

思路: (1)通過先序遍歷的方式求解 (2)葉子節點的特點: 左右孩子都為空 可以用非遞迴的方式 也可以用遞迴方式  package com.zhaochao.tree; import java.util.Stack; /** * Created by z

的中序遍歷版本

轉自來自微信公眾號,一個專注應屆生網際網路求職分享的公眾號,公眾號ID:“菜鳥名企夢” 難易程度:★★ 重要性:★★★★★ 樹結構是面試中的考察的重點,而樹的遍歷又是樹結構的基礎。中序遍歷的非遞迴版本要求重點理解掌握。 //先序遍歷,遞迴版本 public stati