二叉树的 高度 和 最值(非递归)

(非递归)高度和最值 用 出入栈就可以解决

先 准备

#include <stdio.h>
#include <stdlib.h>


//数据 结构体 
struct DATA
{
      int a;
	  char a1[20];	
};

//节点 结构题
struct node
{
	struct DATA data;
	struct node*left;
	struct node*right;
 } ;
 
//搜索树 结构体
struct TREE{
	struct node*root;
}; 

//创建节点
struct node*createnode(struct DATA data)
{
	struct node*newnode=(struct node*)malloc(sizeof(struct node));
	newnode->data=data;
	newnode->left=NULL;
	newnode->right=NULL;
	return newnode;
 } 
 
//创建 搜索树
struct TREE*createtree()
{
	struct TREE*tree=(struct TREE*)malloc(sizeof(struct TREE));
    tree->root=NULL;
    return tree;
 }

 

在操作

 //高度 非递归
int h(struct node*root)
{
	struct node*a[20];
	struct node*pnode=root;
	int i=-1;
	int h=0;              //初始化 高度 
	struct node*x=NULL;   //标记 
	while(pnode)
	{
		a[++i]=pnode;        //入栈 
		pnode=pnode->left;
	}
	while(i!=-1)
	{

		pnode=a[i--];        //出栈 
		if(pnode->right==NULL || pnode->right==x)      	//只要 节点 的右边为空 或者 被标记 
		{
	    //printf("%3d:%s",pnode->data.a,pnode->data.a1);     后续遍历--打印 当前节点的值 
			 x=pnode;                                      //  把 当前节点  标记 
		}
		                                  
		else
		{
			a[++i]=pnode;               // 入栈 
			pnode=pnode->right;          
			while(pnode)
			{
				a[++i]=pnode;         //重复 节点向左的动作 
				pnode=pnode->left;
			}
			if(i>h)   // 当  节点的上一个循环(节点无路可走时  结构体数组的 下标为当前 最大) 
	        h=i;     
		}
	}
	return h+1;      //返回的是 h+1  因为  结构体数组的 下标是从0开始 而高度从1开始 
 } 


 // 最大值 非递归  (前/中 序)
 int max(struct node*root)
 {
      struct node*a[20];
      struct node*pnode=root;
      int max=root->data.a;    //先 假设 根节点 的数据为最大 
      int i=-1;
      while(i!=-1 || pnode)
      {
      	while(pnode)
      	{
      		if(pnode->data.a > max)      // max和循环内的所有几点比较 
      		max=pnode->data.a;      		
      		a[++i]=pnode;                //入栈 
      		pnode=pnode->left;
		  }
		if(i!=-1)
		{  
			pnode=a[i--];               //出栈 
			pnode=pnode->right;
		}
	  }
	  return max;
  } 

 

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiexiexiexieqing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值