二叉树的简单操作
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;
}
相关文章推荐
- 【数据结构】二叉树的简单遍历及基本操作
- 二叉树的简单操作
- 二叉树的简单操作
- 二叉树简单操作
- 二叉树的一些简单操作
- 数据结构之二叉树的简单操作
- 二叉树的简单操作
- 以下是关于二叉树操作的11个简单算法
- 简单的二叉树实现与操作...
- 二叉树简单操作(下)
- 二叉树的简单操作(前中后序遍历,层次遍历,树高,叶子数,交换二叉树等)
- 二叉树的简单操作(c++实现)
- 二叉树的简单操作
- Python - 二叉树简单操作
- 二叉树的创建及简单操作
- 【数据结构】二叉树的简单操作及简单应用
- 遍历二叉树的各种操作(转载的,真心觉得后序遍历用双栈法好简单啊)
- 【数据结构上机练习】7. 二叉树的简单操作(2)
- 【数据结构上机练习】6. 二叉树的简单操作(1)
- 二叉树的遍历算法实现、以及所有简单操作