1. 程式人生 > >求二叉樹深度 -- 遞迴和非遞迴實現

求二叉樹深度 -- 遞迴和非遞迴實現

/*求二叉樹深度 -- 採用遞迴和非遞迴方法
**經除錯可執行原始碼及分析如下:
*/
#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