码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树类

时间:2014-06-20 11:19:10      阅读:193      评论:0      收藏:0      [点我收藏+]

标签:二叉树      数据结构   struct   

上学期数据结构课上写的一个二叉树类,贴出来,写得不是太好,欢迎高手指点。


struct BiNode//定义节点类型 
{
	char data;
	BiNode *lchild;
	BiNode *rchild;
};
class BiTree
{
	private:
		BiNode *root;
	public:
	BiTree()
	{
		root=NULL;
	}
	~BiTree()
	{
		DeleteTree(root);
	}
	void DeleteTree(BiNode *&node)
	{
		if(node)
		{
			DeleteTree(node->lchild);
			DeleteTree(node->rchild);
			delete node;
		}
	}
	int getHeight()//获取高度 
	{
		return getHeight(root);
	}
	int getHeight(BiNode *node)
	{
		if(node==NULL)
		{
			return 0;
		}
		else
		{
			int lh=getHeight(node->lchild);
			int rh=getHeight(node->rchild);
			return lh>rh?lh+1:rh+1;
		}
	}
	void input()
	{
		input(root);
	}
	void input(BiNode *&node)
	{
		char ch;
		if(cin>>ch)
		{
			if(ch=='#')
			{
				node=NULL;
			}
			else
			{
				node=new BiNode;
				node->data=ch;
				input(node->lchild);
				input(node->rchild);
			}
		}
	}
	void PreOrderTraverse()
	{
		PreOrderTraverse(root);
		cout<<endl;
	}
	void PreOrderTraverse(BiNode *node)
	{
		if(node)
		{
			cout<<node->data<<" ";
			PreOrderTraverse(node->lchild);
			PreOrderTraverse(node->rchild);
		}
	}
	void InOrderTraverse()
	{
		InOrderTraverse(root);
		cout<<endl;
	}
	void InOrderTraverse(BiNode *node)
	{
		if(node)
		{
			InOrderTraverse(node->lchild);
			cout<<node->data<<" ";
			InOrderTraverse(node->rchild);
		}
	}
	void PostOrderTraverse()
	{
		PostOrderTraverse(root);
		cout<<endl;
	}
	void PostOrderTraverse(BiNode *node)
	{
		if(node)
		{
			PostOrderTraverse(node->lchild);
			PostOrderTraverse(node->rchild);
			cout<<node->data<<" ";
		}
	}
	int find(const string &str,char c)
	{
		for(int i=0;i<str.size();i++)
		{
			if(c==str[i])
				return i;
		}
		return -1;
	}
	void PreMid(const string &pre,const string &mid)//由前,中序得到二叉树 
	{
		PreMid(root,pre,mid);
	}
	void PreMid(BiNode *&node,const string &pre,const string &mid)
	{
		if(pre.size()==0)
		{
			node=NULL;
			return ;
		}
		int k=find(mid,pre[0]);
		node=new BiNode;
		node->data=pre[0];
		PreMid(node->lchild,pre.substr(1,k),mid.substr(0,k));
		PreMid(node->rchild,pre.substr(k+1,pre.size()-k-1),mid.substr(k+1,mid.size()-k-1));
	}
	void PostMid(const string &post,const string &mid)//由后,中序得到二叉树 
	{
		PostMid(root,post,mid);
	}
	void PostMid(BiNode *&node,const string &post,const string &mid)
	{
		if(post.size()==0)
		{
			node=NULL;
			return ;
		}
		int k=find(mid,post[post.size()-1]);
		node=new BiNode;
		node->data=post[post.size()-1];
		PostMid(node->lchild,post.substr(0,k),mid.substr(0,k));
		PostMid(node->rchild,post.substr(k,mid.size()-k-1),mid.substr(k+1,mid.size()-k-1));
	}
    void recoverTree()//leetcode里面的一道题,修改二叉排序树错误的节点 
    {
        BiNode *s1=NULL,*s2=NULL,*prev=NULL;
        InOrderTraverse(root,s1,s2,prev);
        swap(s1->data,s2->data);
    }
    void InOrderTraverse(BiNode *node,BiNode *&s1,BiNode *&s2,BiNode *&prev)
    {
        if(node==NULL) return;
        InOrderTraverse(node->lchild,s1,s2,prev);
        if(prev!=NULL&&prev->data>node->data)
        {
            s2=node;
            if(s1==NULL) s1=prev;
        }
        prev=node;
        InOrderTraverse(node->rchild,s1,s2,prev);
    }
};


二叉树类,布布扣,bubuko.com

二叉树类

标签:二叉树      数据结构   struct   

原文地址:http://blog.csdn.net/asdfghjkl1993/article/details/28397511

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!