您的位置:首页 > 其它

二叉树的简单操作

2018-01-07 11:41 441 查看

一,定义:

     在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(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; //设置缓冲队列和工
4000
作指针
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: