二叉树的简单操作

一,定义:

     在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆

二,特点

1,二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),。

2,二叉树的子树有左右之分,次序不能颠倒。

3,二叉树的第i层至多有2^{i-1}个结点;

3,深度为k的二叉树至多有2^k-1个结点;

4,对任何一棵二叉树T,如果其终端结点数为n_0,度为2的结点数为n_2,则n_0=n_2+1。

5,一棵深度为k,且有2^k-1个节点称之为满二叉树;

6,深度为k,有n个节点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中,序号为1至n的节点对应时,称之为完全二叉树。

三,基本操作

#include<iostream>
#include<string.h>
using namespace std;
#define Max 10
typedef struct node
{
	char data;
	node* left;
	node* right;
}Node;

typedef Node* pNode;

class binaryTree
{
public:
	binaryTree(char*& str, int _size)
	{
		size = _size;
		int i = 0;
		Root=Create(str,size,i);
	}
	/*binaryTree(binaryTree&tree)
	{
		if (&tree == this)
			return;
		if (this)
		{

		}
	}*/
	~binaryTree()
	{
		if (this)
			distroy(Root);
	}
	void preOrder()
	{
		my_preOrder(Root);
	}
	void inOrder()
	{
		my_inOrder(Root);
	}
	void postOrder()
	{
		my_postOrder(Root);
	}
	void LevelOrder()//层序遍历 
	{
		my_LevelOrder(Root);
	}
	//void swapChild(pNode root**);
	//void leverOrder(pNode root*);
	int NodeHeight()//计算二叉树高度 
	{
		return my_NodeHeight(Root);
	}
	void Showleaf()
	{
		my_Showleaf(Root);
	}
	//检查二叉树是否包含数据aim,有则返回其指针  
	pNode Findnode(char ch)
	{
		return my_Findnode(Root, ch);
	}
protected:
	pNode Create(char* str,int size,int& index)
	{
		pNode pnode=NULL;
		if (str[index] == '#')
			pnode=NULL;
		else if (index<size)
		{
			pnode = new Node;
			pnode->data = str[index];
			pnode->left = Create(str, size,++index);
			pnode->right = Create(str, size,++index);
		}
		return pnode;
	}
	void distroy(pNode root)
	{
		if (root)
		{
	       distroy(root->left);
		   distroy(root->right);
		   delete root;
		   root = NULL;
		}	
	}
	void my_preOrder(pNode Root)
	{
		if (Root)
		{
			cout << Root->data << " ";
			my_preOrder(Root->left);
			my_preOrder(Root->right);
		}
	}
	void my_inOrder(pNode Root)
	{
		if (Root)
		{
			my_preOrder(Root->left);
			cout << Root->data << " ";
			my_preOrder(Root->right);
		}
	}
	void my_postOrder(pNode Root)
	{
		if (Root)
		{
			my_preOrder(Root->left);
			my_preOrder(Root->right);
			cout << Root->data << " ";
		}
	}
	void my_LevelOrder(pNode Root)
	{
		pNode Q[Max], q;           //设置缓冲队列和工作指针    
		int front=0,rear=0;        //缓冲队列头指针和尾指针初始化  
		if(Root==NULL)return;  
		Q[(++rear)%Max]=Root;        //根节点入队  
		while(front!=rear)         //队列不空则继续  
		{  
			q=Q[(++front)%Max];      //队头出队  
			cout<<q->data;         //打印  
			if (q->left != NULL)Q[(++rear) % Max] = q->left;//左孩子入队  
			if (q->right != NULL)Q[(++rear) % Max] = q->right;//右孩子入队  
		} 
	}
	int my_NodeHeight(pNode root)//计算二叉树高度 
	{
		if (root == NULL)
			return 0;
		else
		{	
			int LeftHeight = my_NodeHeight(root->left);
			int RightHeight = my_NodeHeight(root->right);
			return 1 + (LeftHeight >RightHeight ? LeftHeight : RightHeight);
		}
	}
	void my_Showleaf(pNode root)
	{
		if (root)
		{
			if (root->left == NULL&&root->right==NULL)
				cout << root->data;
			my_Showleaf(root->left);
			my_Showleaf(root->right);
		}
	}
	//检查二叉树是否包含数据aim,有则返回其指针  
	pNode my_Findnode(pNode & root, char ch)
	{
		if (root)
		{
			if (root->data == ch)
				return root;
			else
			{
				my_Findnode(root->left, ch);
				my_Findnode(root->right, ch);
			}
		}
	}
private:
	pNode Root;
	int size;
};

int main(void)
{
	char* str = "ABD###CE##F";
	int size = strlen(str);
	binaryTree tree1(str,size);
	tree1.preOrder();
	cout << endl;
	tree1.LevelOrder();
	cout << endl;
	cout <<" 二叉树的高度为:"<< tree1.NodeHeight() << endl;
	cout << "树中叶子节点为:" <<endl;
	tree1.Showleaf();
	cout << "查找C是否在树中:" << endl;
	pNode ptail=tree1.Findnode('C');
	cout << ptail->data << endl;
	return 0;
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值