1. 程式人生 > >二叉樹深度之非遞迴

二叉樹深度之非遞迴

#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<