二叉树类

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

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);
    }
};

二叉树类

时间: 2024-12-21 22:18:01

二叉树类的相关文章

数据结构实验6:C++实现二叉树类

实验6 学号:     姓名:      专业:   6.1 实验目的 掌握二叉树的动态链表存储结构及表示. 掌握二叉树的三种遍历算法(递归和非递归两类). 运用二叉树三种遍历的方法求解有关问题. 6.2 实验要求 按照C++面向对象方法编写二叉树类:二叉树的测试数据可用多种方式进行输入,如键盘输入.静态写入.文件读入等.//最难的是从文件把数据读进去! 设计二叉树的二叉链表存储结构,编写算法实现下列问题的求解. <1>打印出二叉树的三种遍历序列. <2>设计算法按中序次序输出二叉

二叉树类的实现

二叉树结点的抽象数据类型: 1 template<class T> 2 class BinaryTreeNode 3 { 4 friend class BinaryTree<T>; 5 private: 6 T element; //结点的数据域 7 BinaryTreeNode<T>* LeftChild; //结点的左孩子结点 8 BinaryTreeNode<T>* RightChild; //结点的右孩子结点 9 public: 10 BinaryT

三叉链表实现二叉树的基本操作

三叉链表存储表示 改进于二叉链表,增加指向父节点的指针,能更好地实现结点间的访问. 存储结构 /* 二叉树的三叉链表存储表示 */ typedef struct BiTPNode { TElemType data; struct BiTPNode *parent,*lchild,*rchild; /* 双亲.左右孩子指针 */ }BiTPNode,*BiPTree; 下面给出二叉树采用三叉链表,实现了二叉树的构造.遍历.深度.宽度.结点个数.叶子个数 以及 结点的交换.层次.祖先.双亲.左孩子.

研磨数据结构与算法-13删除二叉树节点

节点: /* * 二叉树节点 */ public class Node { //数据项 public long data; //数据项 public String sData; //左子节点 public Node leftChild; //右子节点 public Node rightChild; /** * 构造方法 * @param data */ public Node(long data,String sData) { this.data = data; this.sData = sDa

研磨数据结构与算法-11二叉树的基本操作

节点: /* * 二叉树节点 */ public class Node { //数据项 public long data; //数据项 public String sData; //左子节点 public Node leftChild; //右子节点 public Node rightChild; /** * 构造方法 * @param data */ public Node(long data,String sData) { this.data = data; this.sData = sDa

数据结构——二叉树(Binary Trees)

非线性数据结构 树的密度=结点数/高度 二叉树类 1 #pragma once 2 3 class stnode 4 { 5 public: 6 int nodeValue; // node data 7 8 stnode *left, *right, *parent; // child pointers and pointer to the node's parent 9 10 // constructor 11 stnode (const int item, stnode *lptr = N

Shell排序和二叉树排序

Shell排序 #include<iostream> using namespace std; void Print(int *list, int len); void ShellSort(int *list, int *list2, int len, int gap); void ShellSort(int *list, int *list2, int len, int gap) { int cc = len / gap + (len%gap != 0); int l = 0; for (i

二叉树学习笔记-实现

上一篇文章中,算是初步了解了二叉树是一种怎样的数据结构,也算是有了一个初步的印象.接下来用自己的代码去实现一个二叉搜索树(以下全叫二叉树)类,对外提供常用的接口,比如insert.erase.size.find等等.就像盖房一样,如果说二叉树是一座建筑,那么其中的节点就是一块块砖.要实现二叉树这个类,就必须先实现节点类,假设我们起名为treeNode.在STL标准库中,像一般的数据结构都是模板类,在这里为了方便起见,假设二叉树这个类中保存的数据全是int型. 这个节点类中,需要包含如下的一些成员

java递归之“二叉树”

物有本末,事有始终,知所先后,则近道矣.-----题记. BotWong半路入行it做码农,也就半年时间,竟"不知天高地厚"地来到了深圳闯天下.一口气投了百个简历,一周后终于有公司邀约面试,除了基础的java语法和开发经验,大一点的公司都会出几道题给你做(算法题).BotWong是一头雾水,而且心里很生气!气!气!气!以前自己学的是"人类心理学理论与实践"专业,唯一的计算机基础也就是用过word.excel给客户报过价.自己硬着头皮把java语法和javaEE框架学