二叉树的基本操作

            其实二叉树的基本操作很多, 但基本上都是基于二叉树的遍历的, 大同小异, 因此我我在这选几种写一下, 至于二叉树的遍历, 我在下一篇专门写;而且在树这一章节对递归要求较高,要对2,3,4多思考一下……

1:创建二叉树   2:查找节点   3:求树的深度   4;用括号表示法输出二叉树       

#include<iostream>
using namespace std;
#define MAX(a, b)  a>b?a:b;
typedef struct Node
{
	char data;
	Node *left;
	Node *right;
}BTNode;
Node *stack[100];
//由二叉树的括号表示, 创建二叉树,并返回根节点的指针 
void CreateBTree(  BTNode *&root, char str[])//参数:传入根节点的指针,二叉树的括号表示 
{
	int j=0, flag=0, top=-1;
	BTNode *p=NULL; 
	while( str[j]!='\0')
	{
		switch( str[j] )
		{
			case '(':flag=1;top++;stack[top]=p;break;//若遇到左括号,则把前面刚刚创建的那个节点入栈 
			case ',':flag=2;break;//若遇到逗号,说明其后创建的节点为右孩子节点, flag=2
			case ')':top--;break;//若遇到右括号,说明栈顶结点的左右孩子处理完毕, 栈顶结点出栈
			
			default://遇到元素
			p=new Node;//创建新节点
			p->data=str[j]; p->left=p->right=NULL;//为新建节点赋值:且此时栈顶结点是p的父节点 
			
			if( root==NULL ) //如果根节点为空
			{
			    root=p;
			}
			else 
			{
		    	switch( flag )
			   {
			    	case 1:stack[top]->left=p;break;//flag=1说明p为栈顶元素左儿子
				    case 2:stack[top]->right=p;break;//p为栈顶元素右儿子
			   }
			}	 
		}
		
		j++;
	}
}

//!!查找二叉树中值为ch的节点, 如果找到,返回其指针,否则返回NULL 
BTNode *FindNode(BTNode *root, char ch) //参数:传入根节点,要查找的值 
{
	BTNode *p=NULL;
	if( root==NULL ) return NULL;
	if( root->data==ch ) return p;
	
    p=FindNode(root->left, ch);//查找左子树
    
    if( p!=NULL )  return p;//如果已找到节点, 返回结点的指针 
    else return FindNode(root->right, ch);//否则, 查找右子树 
}

//从0开始,得到树的深度 
int BTreeHeight( BTNode *p)
{
	if( p==NULL ) return 0;
	//获得p的左子树,右子树的深度(都不含p),然后分别加1,表示从p开始,到左子树末端的深度,和到右子树末端的深度;二者取最大值 
	return MAX(BTreeHeight(p->left)+1,BTreeHeight(p->right )+1);
}

//以括号表示输出二叉树 
void DispBTree(BTNode *p)//自己写的
{
	if( p!=NULL ) cout<<p->data;//当p节点非空时输出节点的值 
    else return;//否则,结束 
    if( p->left!=NULL )//遍历左子树 
	{
		cout<<"(";//当p左儿子非空时,输出左括号 
		DispBTree( p->left );
	} 
	
	if( p->right!=NULL)//遍历右子树 
	{
		cout<<",";//当p右儿子非空时,输出逗号  
		DispBTree( p->right );
		cout<<")";// 
	}
	
} 
void PreOrder( Node *p )//先序遍历 
{
	if( p!=NULL )
	{
		cout<<p->data<<" ";
		PreOrder( p->left );
		PreOrder( p->right );
	}
}
int main()
{
	Node *root=NULL;
	char str[100];
	cout<<"请输入二叉树的括号表示:"<<endl; 
	cin>>str;
	
	CreateBTree(root, str);
	
	cout<<"二叉树深度为:"<<endl;
	cout<<BTreeHeight( root )<<endl;
	
	cout<<"输出二叉树:"<<endl;
	DispBTree( root ); 
	cout<<endl;
	
	PreOrder( root ); 
	cout<<endl;
} 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值