自主编程实现二叉树
来源:互联网 发布:端口查询命令 编辑:程序博客网 时间:2024/05/29 07:00
在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。
二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。二叉树的第i层至多有2^{i-1}个结点;深度为k的二叉树至多有2^k-1个结点;对任何一棵二叉树T,如果其终端结点数为n_0,度为2的结点数为n_2,则n_0=n_2+1。
一棵深度为k,且有2^k-1个节点称之为满二叉树;深度为k,有n个节点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中,序号为1至n的节点对应时,称之为完全二叉树。
下面是顺序存储方式的二叉树实现代码:
#include <iostream>using namespace std ;class Tree{char* m_pTree;int m_nSize; //数组大小 public:Tree(int size, char* pRoot);//创建树~Tree();//销毁树char SearchNode(int nodeindex);//根据索引寻找结点bool AddNode(int nodeindex, int direction, char* pNode);//添加结点bool DeleteNode(int nodeindex);//删除结点void TreeTraverse();};Tree::Tree(int size,char *pRoot) //构造函数{ m_nSize = size ;m_pTree = new char[size] ;for(int i=0;i<size;i++){ m_pTree[i] = ' ' ; //将二叉树数组所有内容赋为' ' 代表空}m_pTree[0] = *pRoot ;}Tree::~Tree() //析构函数{delete []m_pTree;m_pTree = NULL;}char Tree::SearchNode(int nodeindex) //寻找数据 传入参数为节点位置{if(nodeindex < 0 || nodeindex >= m_nSize){return NULL;}if(m_pTree[nodeindex] == ' '){return NULL;}return m_pTree[nodeindex];}bool Tree::AddNode(int nodeindex, int direction, char* pNode) //添加数据 nodeindex为父结点位置{if(nodeindex < 0 || nodeindex >= m_nSize){return false;}if(m_pTree[nodeindex] == 0){return false;}if(direction == 0) //左子树{if(nodeindex*2+1 >= m_nSize){return false;}if(m_pTree[nodeindex*2+1] != ' ') //该位置已有数据{return false;}m_pTree[nodeindex*2+1] = *pNode; //在该位置赋值}if(direction == 1) //右子树{if(nodeindex*2+2 >= m_nSize){return false;}if(m_pTree[nodeindex*2+2] != ' '){return false;}m_pTree[nodeindex*2+2] = *pNode;}return true;}bool Tree::DeleteNode(int nodeindex) //删除结点{if(nodeindex < 0 || nodeindex >= m_nSize){return false;}if(m_pTree[nodeindex] == ' ') //该位置为空 无数据{return false;}//char Node = m_pTree[nodeindex]; //cout<<Node << endl ; //打印删除的结点数据m_pTree[nodeindex] = ' '; //位置赋空return true;}void Tree::TreeTraverse() //打印二叉树内容{for(int i = 0; i < m_nSize; i++){cout<<m_pTree[i]<<" ";}cout<<endl ;}int main(){ char Node = 'a' ; Tree * mTree = new Tree(20,&Node) ; char node1 = 'b'; char node2 = 'c'; mTree->AddNode(0, 0, &node1); mTree->AddNode(0, 1, &node2); mTree->TreeTraverse() ; cout<<mTree->SearchNode(2)<<endl ; mTree->DeleteNode(2); mTree->TreeTraverse() ; return 0 ;}
下面是链表存储方式的二叉树实现代码:
#include <iostream>using namespace std ;class Node ;class Tree{Node * m_pRoot;public:Tree();//创建树~Tree();//销毁树Node * SearchNode(int nodeindex);//根据索引寻找结点bool AddNode(int nodeindex, int direction, Node* pNode);//添加结点bool DeleteNode(int nodeindex, Node* pNode);//删除结点void PreorderTraversal();//前序遍历void InorderTraversal();//中序遍历void PostorderTraversal();//后序遍历};class Node {public:Node();Node* SearchNode(int nodeindex);void DeleteNode();void PreorderTraversal();//前序遍历void InorderTraversal();//中序遍历void PostorderTraversal();//后序遍历int index;char data;Node* pLChild;Node* pRChild;Node* pParent;};Tree::Tree()//初始化这棵树{m_pRoot = new Node();}Tree::~Tree(){//DeleteNode(0, NULL);m_pRoot->DeleteNode();}Node* Tree::SearchNode(int nodeIndex){return m_pRoot->SearchNode(nodeIndex);}bool Tree::AddNode(int nodeIndex, int direction, Node* pNode) //添加结点{Node* temp = SearchNode(nodeIndex); //根据索引寻找结点if(temp == NULL){return false;}Node* node = new Node();if(node == NULL){return false;}node->index = pNode->index;node->data = pNode->data;node->pParent = temp;if(direction == 0){temp->pLChild = node;}else if(direction == 1){temp->pRChild = node;}return true;}bool Tree::DeleteNode(int nodeIndex, Node* pNode) //删除结点{Node* temp = SearchNode(nodeIndex);if(temp == NULL){return false;}if(pNode != NULL){pNode->data = temp->data;}temp->DeleteNode();return true;}void Tree::PreorderTraversal() //前序遍历{m_pRoot->PreorderTraversal();}void Tree::InorderTraversal() //中序遍历{m_pRoot->InorderTraversal();}void Tree::PostorderTraversal() //后序遍历{m_pRoot->PostorderTraversal();}Node::Node() //结点构造函数{index = 0;data = ' ';pLChild = NULL;pRChild = NULL;pParent = NULL;}Node* Node::SearchNode(int nodeindex) {if(this->index == nodeindex){return this;}Node *temp;if(this->pLChild != NULL){if(this->pLChild->index == nodeindex){return this->pLChild;}else {temp = this->pLChild->SearchNode(nodeindex);if(temp != NULL){return temp;}}}if(this->pRChild != NULL){if(this->pRChild->index == nodeindex){return this->pRChild;}else {temp = this->pRChild->SearchNode(nodeindex);if(temp != NULL){return temp;}}}return NULL;}void Node::DeleteNode(){if(this->pLChild != NULL){this->pLChild->DeleteNode();}if(this->pRChild != NULL){this->pRChild->DeleteNode();}if(this->pParent != NULL){if(this->pParent->pLChild == this){this->pParent->pLChild = NULL;}if(this->pParent->pRChild == this){this->pParent->pRChild = NULL;}}delete this;}void Node::PreorderTraversal(){cout<<this->index<<" "<<this->data<<endl;if(this->pLChild != NULL){this->pLChild->PreorderTraversal();}if(this->pRChild != NULL){this->pRChild->PreorderTraversal();}}void Node::InorderTraversal(){if(this->pLChild != NULL){this->pLChild->InorderTraversal();}cout<<this->index<<" "<<this->data<<endl;if(this->pRChild != NULL){this->pRChild->InorderTraversal();}}void Node::PostorderTraversal(){if(this->pLChild != NULL){this->pLChild->PostorderTraversal();}if(this->pRChild != NULL){this->pRChild->PostorderTraversal();}cout<<this->index<<" "<<this->data<<endl;}int main(){Tree *tree = new Tree();Node* node1 = new Node;node1->index = 1;node1->data = 'a';Node* node2 = new Node;node2->index = 2;node2->data = 'b';Node* node3 = new Node;node3->index = 3;node3->data = 'c';tree->AddNode(0, 0, node1);tree->AddNode(0, 1, node2);tree->AddNode(1, 0, node3);//tree->DeleteNode(2, NULL);//tree->PreorderTraversal();//tree->InorderTraversal();tree->PostorderTraversal();delete tree;return 0;}
阅读全文
0 0
- 自主编程实现二叉树
- 自主编程实现单链表
- 自主编程实现哈希表
- 自主编程实现二分法查找
- 自主编程实现栈和链式栈
- 自主编程实现选择,冒泡,快速,归并,希尔排序
- 自主编程实现数组队列和链式队列
- AI系统首次实现自主编程,完爆初级程序员!
- [编程实现]重构二叉树
- [每日练习]C编程实现二叉树
- 二叉树的编程与实现
- php编程--二叉树遍历算法实现
- 自主shell脚本编程
- 评自主创新与自主实现
- C#自主脚本实现
- 【Linux】自主实现my_sleep
- 树莓派实现自主导航
- 自主编程实现strlen,strcpy,strcmp,strcnpy,strcat,strstr,strchr库函数
- webix Tab页面装换
- LoaderManager使用详解(一)---没有Loader之前的世界
- 如何用Doxgen制作chm格式文档
- Linux下gcc常用命令
- l*cos(theta) & l*sin(theta)
- 自主编程实现二叉树
- 取消UICollectionView 的reloadItemsAtIndexPath默认动画
- Tiny4412标准版简介
- 用sqlplus为oracle创建用户和表空间
- 两个数组合并到一个数组
- Java编程思想之操作符
- Spring框架之IOC
- 2017 Multi-University Training Contest
- 归并排序