二叉樹深度之非遞迴
#include <stdio.h> #include <malloc.h> typedef int ElemType; #define MaxSize 50 typedef struct node { ElemType data; struct node *lchild; struct node *rchild; }BTNode; typedef struct { BTNode *data[MaxSize]; int front,rear; }SqQueue; // 建立二叉樹 void CreateBTree(BTNode *&b,char *str) { BTNode * St[MaxSize],*p; int top=-1,k,j=0; char ch; b=NULL; ch=str[j]; while(ch!='\0') { switch (ch) { case '(':top++;St[top]=p;k=1;break; case ')':top--;break; case ',':k=2;break; default:p=(BTNode*)malloc(sizeof(BTNode)); p->data=ch; p->lchild=p->rchild=NULL; if(b==NULL) b=p; else { switch (k) { case 1:St[top]->lchild=p;break; case 2:St[top]->rchild=p;break; } } } j++; ch=str[j]; } } // 銷燬二叉樹 void DestroyBTree(BTNode *& b) { if(b!=NULL) { DestroyBTree(b->lchild); DestroyBTree(b->rchild); free(b); } } void DispBTree(BTNode *b) { if(b!=NULL) { printf("%c",b->data); if(b->lchild!=NULL || b->rchild!=NULL) { printf("("); DispBTree(b->lchild); if(b->rchild!=NULL) printf(","); DispBTree(b->rchild); printf(")"); } } } // 初始化佇列 void InitQueue(SqQueue *&q) { q=(SqQueue*)malloc(sizeof(SqQueue)); q->front=q->rear=-1; } // 銷燬佇列 void DestroyQueue(SqQueue *&q) { free(q); } // 判斷佇列是否為空 bool QueueEmpty(SqQueue *q) { return(q->front==q->rear); } // 入隊 bool enQueue(SqQueue *&q,BTNode* b) { if(q->rear==MaxSize-1) return false; q->rear++; q->data[q->rear]=b; return true; } // 出隊 bool deQueue(SqQueue *&q,BTNode* &b) { if(q->front==q->rear) return false; q->front++; b=q->data[q->front]; return true; } // 非遞迴求樹的深度 int BTHeight(BTNode * b) { int depth=0,hp,tp,lc; SqQueue *Q; BTNode *p; if(b) { p=b; hp=0;tp=1;lc=1; InitQueue(Q); enQueue(Q,p); while(!QueueEmpty(Q)) { deQueue(Q,p); hp++; if(p->lchild) { enQueue(Q,p->lchild); tp++; } if(p->rchild) { enQueue(Q,p->rchild); tp++; } if(hp==lc) { depth++; lc=tp; } } } DestroyQueue(Q); return depth; } void main() { BTNode *b; CreateBTree(b,"A(B(D(,G)),C(E,F))"); DispBTree(b); int depth=BTHeight(b); printf("\n二叉樹深度:%d",depth); DestroyBTree(b); getchar(); }
相關推薦
二叉樹深度之非遞迴
#include <stdio.h> #include <malloc.h> typedef int ElemType; #define MaxSize 50 typedef struct node { ElemType data; struc
二叉樹學習之非遞迴遍歷
二叉樹遞迴遍歷可謂是學過資料結構的同仁都能想一下就能寫出來,但在應聘過程我們常常遇到的是寫出一個二叉樹非遞迴遍歷函式,接著上篇文章寫二叉樹的非遞迴遍歷,先難後易,一步一步的來. 先上程式碼: #include "binarytree.h" #include <
二叉樹遍歷非遞迴寫法之大統一
在學習二叉樹遍歷時,大家都很容易接受遞迴寫法,好理解。對於非遞迴寫法,基本思想是用棧消除遞迴,但是教材上的前序、中序和後序基本上三個寫法,還很難理解。博主親身經歷,找工作中,考查二叉樹遍歷的非遞迴寫法還是常見的。所以決心整理出此文,方便理解和記憶二叉樹遍歷。
二叉樹深度求解(遞迴,非遞迴)
1 int TreeDeep(BinTree BT ){ 2 int treedeep=0; 3 stack S; 4 stack tag; 5 BinTree p=BT; 6 while(p!=NULL||!isEmpty(S)){ 7
二叉樹遍歷非遞迴演算法
二叉樹遍歷的非遞迴演算法(java實現) package com.mpackage.tree; import java.util.*; public class TreeSolution { //先根遍歷 public static ArrayList
資料結構二叉樹三種非遞迴的遍歷
#include <stdio.h> #include <malloc.h> #define MAX 30 typedef struct TiNode {char date;struct TiNode *lchild;struct TiNode *r
求二叉樹的高度(非遞迴) .----美團二面=----硬傷 當時沒有答上來
#include <queue> using namespace std; int calculateTreeHeight(Node *root) { if(root == NULL) return 0; int visitedNumber = 0;
Java實現二叉樹後序非遞迴遍歷(好理解)
//不明白的大家可以一起討論!歡迎留言! /** * public class Node { public int data; //樹結點標號 public Node lchild;
二叉樹遍歷非遞迴寫法c++
1、前序遍歷 /* 將根節點壓棧,(棧先進後出) 然後對於棧頂節點,先輸出棧頂節點的值, 然後把右孩子壓棧,再把左孩子壓棧。 對應於先序遍歷的先遍歷父節點,再遍歷左節點再遍歷右節點的順序 */ void preOrderRecursion(treeNode
二叉連結串列(鏈式二叉樹)的非遞迴建立
這裡我採用的是先序非遞迴建立二叉樹。思路很簡單: 首先要有一個結點陣列。 1.取第一個結點,是否為空,不是就作為樹根,壓棧,是空則樹根為空,結束。 2.取下一個結點a。 3.取棧頂結
對於二叉樹三種非遞迴遍歷方式的理解
解決二叉樹的很多問題的方案都是基於對二叉樹的遍歷。遍歷二叉樹的前序,中序,後序三大方法算是計算機科班學生必寫程式碼了。其遞迴遍歷是人人都能信手拈來,可是在手生時寫出非遞迴遍歷恐非易事。正因為並非易事,所以網上出現無數的介紹二叉樹非遞迴遍歷方法的文章。可是大家需要的真是那些非遞迴遍歷程式碼和講述嗎?程式碼早
二叉樹遍歷非遞迴寫法
來源:http://www.cnblogs.com/BaroC/p/5188545.html 遍歷的非遞迴實現是用棧來實現的,因為棧能提供先入後出。而對於層序遍歷,由於需要遵循層的順序,使用佇列。 1.先序遍歷(中左右) 初始化:根節點入棧。 迴圈:出棧一個節點,訪問這個節
二叉樹的建立、遞迴,非遞迴遍歷
#include<bits/stdc++.h> using namespace std; typedef struct ListNode{ struct ListNode *Lchild, *Rchild; string str; ListNode():Lchild
二叉樹DFS和BFS 遞迴/非遞迴
二叉樹DFS和BFS 遞迴/非遞迴方式 1.DFS DFS, 深度優先遍歷 (1)遞迴形式 public class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int
筆記九:二叉樹的建立、遞迴與非遞迴版前序、中序、後序查詢、樹高和節點判斷
程式碼: #include<iostream> #include<vector> #include<stack> using namespace std; template<typename T> str
二叉樹的遍歷(遞迴與非遞迴版本)
最近在寫關於二叉樹方面的題目的時候,總是會用到二叉樹的各種遍歷,所以在這裡將自己寫的各種遍歷,都記錄下來. 遞迴部分: 首先二叉樹的遞迴程式碼是比較簡單的,而且前序,中序和後序遍歷程式碼幾乎一樣, 只是列印節點值的輸出語句的位置不一樣. 可以遞迴部分,對於二叉樹中節點的遍歷順序是一樣的,
C語言 二叉樹的遍歷 遞迴和(多種)非遞迴演算法
//二叉樹遍歷 //作者:nuaazdh //時間:2011年12月1日 #include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #defi
c語言實現二叉樹(二叉連結串列)非遞迴後序遍歷
演算法思想 因為後序遍歷是先訪問左子樹,再訪問右子樹,最後訪問根節點。當用棧實現遍歷時,必須分清返回根節點時,是從左子樹返回的還是從右子樹返回的。所以使用輔助指標r指向最近已訪問的結點。當然也可以在節點中增加一個標誌域,記錄是否已被訪問。 #include<iost
二叉樹:二叉樹的遍歷(遞迴與非遞迴)
二叉樹的前序、中序、後序遍歷: 遞迴實現:不同順序改變遞迴就行。 前序: class Solution { public List<Integer> preorderTraversal(TreeNode root) {
二叉樹基本演算法,遞迴非遞迴遍歷以及求高度、寬度等
二叉樹基本演算法,遍歷以及求高度、寬度等路徑 轉自Powered by: C++部落格 Copyright © 天一程 //二叉樹的相關演算法,《資料結構習題與解析》7.3 //演算法 49個,程式碼量1200+ ,時間9小時 #include<