求二叉樹深度 -- 遞迴和非遞迴實現
/*求二叉樹深度 -- 採用遞迴和非遞迴方法
**經除錯可執行原始碼及分析如下:
*/
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <queue>
using namespace std;
/*二叉樹結點定義*/
typedef struct BTreeNode
{
char elem;
struct BTreeNode *pleft;
struct BTreeNode *pright;
}BTreeNode;
/*
*如果根節點為NULL,則深度為0
*如果根節點不為NULL,則深度 = 左右子樹的深度的最大值+1
*/
/*遞迴實現求深度*/
int get_depth(BTreeNode *proot)
{
if (proot == NULL)
{
return 0;
}
int left_depth = get_depth(proot->pleft);
int right_depth = get_depth(proot->pright);
return (((left_depth > right_depth) ? left_depth:right_depth) + 1);
}
/**********************************************************/
/*非遞迴:藉助佇列,在進行按層遍歷時,記錄遍歷的層數即可。
**/
/*非遞迴實現求深度*/
int get_depth2(BTreeNode* proot)
{
int depth = 0;
if (proot == NULL)
{
return 0;
}
queue <BTreeNode *> que;
que.push(proot);
while (!que.empty())
{
++depth;
int cur_level_nodes_count = que.size();//當前層節點數量
int temp_count = 0;//計數器:當前層次節點個數
while (temp_count < cur_level_nodes_count)
{
++temp_count;
proot = que.front();
que.pop();
if (proot->pleft != NULL)
{
que.push(proot->pleft);
}
if (proot->pright != NULL)
{
que.push(proot->pright);
}
}
}
return depth;
}
/**********************************************************/
/*初始化二叉樹根節點*/
BTreeNode* btree_init(BTreeNode* &bt)
{
bt = NULL;
return bt;
}
/*先序建立二叉樹*/
void pre_crt_tree(BTreeNode* &bt)
{
char ch;
cin >> ch;
if (ch == '#')
{
bt = NULL;
}
else
{
bt = new BTreeNode;
bt->elem = ch;
pre_crt_tree(bt->pleft);
pre_crt_tree(bt->pright);
}
}
int main()
{
int tree_depth = 0;
BTreeNode *bt;
btree_init(bt);//初始化根節點
pre_crt_tree(bt);//建立二叉樹
tree_depth = get_depth(bt);//遞迴
cout << "二叉樹深度為:" << tree_depth << endl;
tree_depth = get_depth2(bt);//非遞迴
cout << "二叉樹深度為:" << tree_depth << endl;
system("pause");
return 0;
}
/*
執行結果:
a b c # # # d # #
---以上為輸入---
---以下為輸出---
二叉樹深度為:3
二叉樹深度為:3
請按任意鍵繼續. . .
本例建立的二叉樹形狀:
a
b d
c
參考資料:
http://blog.csdn.net/beitiandijun/article/details/41930583
http://yuncode.net/code/c_505ea04f8f6186
*/
相關推薦
資料結構實驗-C語言-二叉樹的建立,前、中、後序遍歷的遞迴演算法和非遞迴演算法,求葉子結點數目,求二叉樹深度,判斷二叉樹是否相似,求二叉樹左右子樹互換,二叉樹層序遍歷的演算法,判斷二叉樹是否是完全二叉樹
1.實驗目的 熟練掌握二叉樹的二叉連結串列儲存結構的C語言實現。掌握二叉樹的基本操作-前序、中序、後序遍歷二叉樹的三種方法。瞭解非遞迴遍歷過程中“棧”的作用和狀態,而且能靈活運用遍歷演算法實現二叉樹的其它操作。 2.實驗內容 (1)二叉樹的二叉連結串列的建立 (2)二叉樹的前、中、後
求二叉樹深度 -- 遞迴和非遞迴實現
/*求二叉樹深度 -- 採用遞迴和非遞迴方法 **經除錯可執行原始碼及分析如下: */ #include <stdio.h> #include <stdlib.h> #inclu
java實現遞迴和非遞迴求二叉樹深度
一.遞迴實現,深度優先遍歷二叉樹 public int dfs(TreeNode root){ if(null==root){ return 0;
java 遞迴求二叉樹深度
給定二叉樹,找到它的最大深度。 最大深度是從根節點到最遠葉節點的最長路徑上的節點數。 注意:葉子是沒有子節點的節點。 Example: Given binary tree [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 1
利用棧結構實現二叉樹的非遞迴遍歷,求二叉樹深度、葉子節點數、兩個結點的最近公共祖先及二叉樹結點的最大距離
原文地址:http://blog.csdn.net/forbes_zhong/article/details/51227747 利用棧實現二叉樹的非遞迴遍歷,並求二叉樹的深度、葉子節點數、兩個節點的最近公共祖先以及二叉樹結點的最大距離,部分參考《劍指offer》這本書
【演算法導論】求二叉樹的葉子數和深度
/**********************************************\ 函式功能:計算葉子節點個數 輸入: 二叉樹的根節點 輸出: 葉子節點個數 \**********************************************/ int countleaf(
二叉樹深度優先遍歷(遞迴、非遞迴)、廣度優先遍歷、構建二叉樹
public class BinaryTree { static class TreeNode{ int value; TreeNode left; TreeNode right; public Tree
求二叉樹的前中後序遞迴、迭代,樹的葉子節點,高度(c語言)
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<assert.h> #define MAX 100 typedef struct n
C語言實現的求二叉樹的最大寬度(遞迴與非遞迴版本)
一、遞迴 這裡說的遞迴,並非是指整個函式遞迴,而是說其中一個子函式使用了遞迴。整個思路可以如下:要求取最大寬度,可以迴圈求取每一層的寬度,存入一個數組,然後在這個數組裡求最大值即可,陣列下標即層數(或高度)。對於求某一層的寬度,考慮把它寫成一個子函式,引數考慮起始結點以及對
二叉樹後序遍歷非遞迴實現(java)
後序遍歷:雙棧法,和層次遍歷(雙佇列)很相似,唯一區別在於層次遍歷用的 是佇列,後序遍歷用的是棧。 public static void posOrderUnRecur1(Node head){ System.out.print("PosOrder:"); if(head !=
演算法--20181109--二叉樹中序遍歷非遞迴實現
1.二叉樹的中序遍歷 首先看一下遞迴方式的實現方式: class TreeNode: left = None right = None var = 0 def __init__(self, var): self.var = var
二叉樹中序遍歷(非遞迴)演算法實現--C語言
今天繼續二叉樹的學習。 昨天寫了一遍二叉樹的先序遍歷(非遞迴)演算法,今天寫一下二叉樹的二叉樹的中序遍歷(非遞迴)演算法。中序遍歷的非遞迴演算法有兩種,但是個人覺得只要掌握一種就可以了,只要自己的邏輯清晰,會哪一種又有什麼關係呢~ 首先給出今天的二叉樹的示例圖: 程式碼如下:
面試題目整理--20181109--二叉樹中序遍歷非遞迴實現
非遞迴實現二叉樹的中序遍歷 首先看一下遞迴方式的實現方式: class TreeNode: left = None right = None var = 0 def __init__(self, var): self.var
遍歷二叉樹的各種操作(非遞迴遍歷)
先使用先序的方法建立一棵二叉樹,然後分別使用遞迴與非遞迴的方法實現前序、中序、後序遍歷二叉樹,並使用了兩種方法來進行層次遍歷二叉樹,一種方法就是使用STL中的queue,另外一種方法就是定義了一個數組佇列,分別使用了front和rear兩個陣列的下標來表示入隊與出隊,還有
二叉樹後序遍歷(非遞迴)演算法實現--C語言
一直說要寫二叉樹的後序非遞迴遍歷演算法,但是前兩天各種事情,今天終於有時間好好寫一寫二叉樹的後序遍歷演算法。 二叉樹的後序遍歷演算法比先序和中序的遍歷演算法要複雜一些。其出棧條件有兩種情況: 棧頂元素所指向的節點的左子樹和右子樹均為空; 棧頂元素所指向的節點的左子樹
有關二叉樹的遍歷問題非遞迴
最近在刷題,經常會遇到一些樹的遍歷問題。在之前也寫過部落格詳細講解二叉樹遍歷問題的遞迴實現,可以戳有關二叉樹的遍歷問題去瞅瞅。這篇部落格主要想整理一下非遞迴的實現及遍歷思想。 如上圖這是一個二叉樹。以前序為例,如果我們想直接去遍歷結點,肯定是不行的。首先肯
LeetCode——第題:求二叉樹深度
題目: 給定一個二叉樹,找出其最大深度。 二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。 說明: 葉子節點是指沒有子節點的節點。 示例: 給定二叉樹 [3,9,20,null,n
遍歷二叉樹的各種操作(非遞迴遍歷) 轉載自:hackbuteer1 前輩
在網上看了很多的人寫的二叉樹的非遞迴的遍歷,但是能執行的正確的並不多。感謝hackbuteer1 前輩 寫出了這樣清晰和完美的程式碼。 特轉載和保存於此。 先使用先序的方法建立一棵二叉樹,然後分別使用遞迴與非遞迴的方法實現前序、
遞迴二叉樹的序列列印、非遞迴二叉樹的序列列印
遞迴二叉樹的序列列印 請用遞迴方式實現二叉樹的先序、中序和後序的遍歷列印。 給定一個二叉樹的根結點root,請依次返回二叉樹的先序,中序和後續遍歷(二維陣列的形式)。 我的提交 # -*- coding:utf-8 -*- # cla
[C/C++] 先序建立二叉樹| 先序、中序、後序遍歷二叉樹| 求二叉樹深度、節點數、葉節點數 演算法實現
/* * BinTree.h */ #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #defi