设计一个非递归算法 从一棵二叉树中查找出所有节点的最大值并返回

如题所述

用广度搜索
创建队列
创建初始MAX值 0
将树跟放入队列
将树根取出队列和MAX对比 比MAX大则替换MAX
然后将取出节点的左右子节点放入队列
如上遍历队列
依次类推
最后得出MAX值
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-10-08
请参考:
// Test6.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"

#define MAX 100
#define EMPTY 0xFFFF

struct stack
{
int data[MAX];
int top;
}Stack;

struct Tree
{
char data;
struct Tree *left;
struct Tree *right;
};

struct queue
{
//char data[MAX];
struct Tree *data[MAX];
int front;
int rear;
}Queue;

//栈中top所指向的保留为空
void Initial();
void PushStack(int iData);
int PopStack();

//队列中rear所指向的保留为空
void InsertQueue(struct Tree *iData);
struct Tree * DeleteQueue();

void CreateTree(struct Tree **root);
void PrintTree(struct Tree *r, int order);
void TransLevel(struct Tree *r);

struct Tree * TransLevel_MaxNum(struct Tree *r);

int main(int argc, char* argv[])
{

Initial();
struct Tree *root=NULL;
CreateTree(&root);
printf("\n层次遍历:");
//TransLevel(root);
struct Tree *p =TransLevel_MaxNum(root);
printf("\nMax char is :%c\n",p->data);
return 0;
}

void Initial()
{
int i=0;
struct Tree t={0,NULL,NULL};
for (i=0; i<MAX; i++)
{
Stack.data[i] = 0;
Queue.data[i] = &t;
}
Stack.top = 0;

Queue.front = 0;
Queue.rear = 0;

}

void PushStack(int iData)
{
if (Stack.top>=MAX-1)
{
printf("Stack is full!\n");
return ;
}
Stack.data[Stack.top] = iData;
Stack.top = Stack.top+1;
}
int PopStack()
{
if (Stack.top == 0)
{
printf("Stack is empty!\n");
return EMPTY;
}
int temp=0;
Stack.top = Stack.top-1;
temp = Stack.data[Stack.top];
return temp;

}
void InsertQueue(struct Tree *t)
{
if (Queue.front == (Queue.rear+1)%MAX )
{
printf("\nQueue is full\n");
return ;
}
Queue.data[Queue.rear] = t;
Queue.rear = (Queue.rear+1)%MAX;
}
struct Tree * DeleteQueue()
{
// struct Tree t={0,NULL,NULL};
if (Queue.front == Queue.rear)
{
printf("\nQueue is empty\n");
return NULL;
}
struct Tree *temp=NULL;

temp = Queue.data[Queue.front];
Queue.front = (Queue.front+1)%MAX;
return temp;
}

void CreateTree(struct Tree **root)
{
char ch;
ch = getchar();
if (ch == '#')
{
return ;
}
*root = (struct Tree *)malloc(sizeof(struct Tree));
(*root)->data = ch;
(*root)->left = NULL;
(*root)->right = NULL;
CreateTree(&(*root)->left);
CreateTree(&(*root)->right);
}

void PrintTree(struct Tree *r,int order)
{
if (r == NULL)
{
return ;
}
switch(order)
{
case 0:printf("%c",r->data);
PrintTree(r->left, order);
PrintTree(r->right,order);
break;
case 1:PrintTree(r->left,order);
printf("%c",r->data);
PrintTree(r->right,order);
break;
case 2:PrintTree(r->left,order);
PrintTree(r->right,order);
printf("%c",r->data);
break;
}
}

void TransLevel(struct Tree *r)
{
if (r == NULL)
{
return ;
}
InsertQueue(r);
struct Tree *pTree=NULL;
while ( (pTree=DeleteQueue()) != NULL )
{
printf("%c",pTree->data);
if (pTree->left != NULL)
{
InsertQueue(pTree->left);
}
if (pTree->right != NULL)
{
InsertQueue(pTree->right);
}
}
}

struct Tree * TransLevel_MaxNum(struct Tree *r)
{
if (r == NULL)
{
return NULL;
}
struct Tree *temp=r;
int maxNum = r->data;
InsertQueue(r);
struct Tree *pTree=NULL;
while ( (pTree=DeleteQueue()) != NULL )
{
printf("%c",pTree->data);
if (pTree->data > maxNum)
{
maxNum = pTree->data;
temp = pTree;
}
if (pTree->left != NULL)
{
InsertQueue(pTree->left);
}
if (pTree->right != NULL)
{
InsertQueue(pTree->right);
}
}
return temp;
}

//其中栈的代码为练习所用,非必要代码本回答被提问者采纳

如何用非递归算法求二叉树的高度
last=rear;//last指向下层节点} }

假设二叉树采用二叉链表作为存储结构,试编写一个算法:求任意一个指定结...
非递归中序遍历 构造变量count记录当前层访问到的节点数,nextcount记录当前层的总个数;每当访问过一层层数depth++;此种方法同时可以求最大宽度,访问第几层的第几个节点,求带权路径长度WPL,是一种通用方法!int TreeDepth(TreeNode* pRoot){queueq;q.push(pRoot);if(pRoot==NULL)return 0;T...

...请写出计算二叉树中度为2的结点数目的非递归算法
采用深度或者广度遍历就可以,分别采用栈或者队列结构。对于访问到的每个节点,如果度为2,就是所求的。比如用栈的话 push(ST,root)while(not empty(ST)){ node=pop(ST)if(node->left)push(ST,node->left)if(node->right)push(ST,node->right)} 上面的伪代码实际上就是图的深度遍历,二叉树...

关于数据结构的问题,用C语言描述
1.设一函数f(x,y)=(1+A*(e^B\/cosθ)*(1+C*(cosψ)^2),其中θ=(π*x)\/180,ψ=(π*y)\/180,参数A=-0.5,B=-0.4,C=-0.1。x从0变化到89,步长为1,y从0变化到359,步长为1。采用一种数据结... 1. 设一函数 f(x,y)=(1+A*(e^B\/cosθ)*(1+C*(cosψ)^2),其中θ=(π*x)\/18...

二叉树的生成.输入一个二叉树的中根遍历序列和后根遍历序列,用非递归...
中序遍历这可二叉树 先看根节点 1 \/ \\ 左子树 右子树 我们应该先遍历左子树 也就是下面这棵树 2 \/ \\ 4 5 对于这棵树在进行中序遍历 我们应先遍历她的左子树 他只有一个根节点4,左右子树都为空 哪么遍历这个只有一个根节点的二叉树 先访问她的左子树,为空 返回...

二叉树先序非递归遍历C语言算法
printf("先序非递归建立一个二叉树:"); if((ht=createprebitree())!=NULL) \/\/非递归建立 \/\/CreateBiTree(&ht); \/\/if(ht!=NULL) \/\/递归建立 { printf("先序遍历输出二叉树:"); preordertraverse(ht); putchar('\\n'); printf("中序遍历输出二叉树:"); inordertraverse(ht); putchar('\\n')...

数据结构先序构建一棵二叉树,中序非递归遍历二叉树的程序
T){ \/\/先序遍历二叉树T的递归算法 if (T){ printf("%d ",T->data);if(T->lchild)PreOrderTraverse(T->lchild);if(T->rchild)PreOrderTraverse(T->rchild);return FALSE;} else return OK;} Status PreOrder(BiTree T){ \/\/先序遍历二叉树T的非递归算法 while(!(T==NULL&&top==NULL...

构造一棵二叉树,并分别输出其先序遍历、中序遍历和后序遍历的结果
cout<<"请输入相应二叉树:"<<endl;CreateBiTree(T);cout<<"二叉树的先序遍历为:"<<endl;preBiTree(T);cout<<endl;cout<<"二叉树的中序遍历为:"<<endl;InBiTree(T);cout<<endl;cout<<"二叉树的后序遍历为:"<<endl;PostBiTree(T);cout<<endl;cout<<"二叉树的深度为:"<<endl;cout...

求数据结构试题…重点
2.4:度量算法的时间效率,时间复杂度,(课本39页)。2.5:递归定义:即用一个概念本身直接或间接地定义它自己。递归定义有两个条件:至少有一条初始定义是非递归的,如1!=1. 由已知函数值逐步递推计算出未知函数值,如用(n-1)!定义n!。 第二章:线性表1.1线性表:线性表是由n(n>=0)个类型相同的数据元素a0,a1...

7.写出二叉树中序遍历的非递归算法。 8.编写求二叉树深度的算法。 9...
void coutBT(BiTNode *t,int &m,int &n,int &i)\/\/4、计算二叉树中叶子结点、度为2的结点和度为1的结点的个数 { if(!EmptyBT(t)){ if((t->lchild==0) && (t->rchild==0))m++;\/\/叶子结点 else if((t->lchild!=0) && (t->rchild!=0))i++;\/\/度为2的结点 else n++;\/...

相似回答