-
数组和树之间的关系
父节点下标*2+1 该节点左 父节点下标*2+2 该节点右
查看全部 -
不会啊,我就是按老师的代码敲的/************************************************************二叉树(链表表示)课程要求:完成二叉树的基本操作1,树的创建和销毁2,树中结点的搜索3,树中结点的添加与删除4,树中结点的遍历Tree(); //创建树~Tree(); //销毁树Node *SearchNode(Tree *pTree,int nodeindex); //根据索引寻找结点bool AddNode(Tree *pTree,int nodeindex,int direction,Node *pNode); //添加结点bool DeleteNode(Tree *pTree,int nodeindex,Node *pNode); //删除结点void preorderTraverse(); //先序遍历二叉树void InorderTraverse(); //中序遍历二叉树void PosorderTraverse(); //后序遍历二叉树结点要素:索引、数据、左孩子指针、右孩子指针、父结点指针3(0)5(1) 8(2)2(3) 6(4) 9(5) 7(6)那个direction是“0”时表示插入到左孩子,是“1”时表示插入到右孩子先序遍历结果(根----左----右)0 1 3 4 2 5 6中序遍历结果(左----根----右)3 1 4 0 5 2 6后序遍历结果(左----右----根)3 4 1 5 6 2 0*************************************************************/#include<iostream>#include<stdio.h>usingnamespacestd;classNode{public:Node();//构造函数Node *SearchNode(intnodeindex);voidDeleteNode();voidpreorderTraverse();//先序遍历二叉树voidInorderTraverse();//中序遍历二叉树voidPosorderTraverse();//后序遍历二叉树intindex;intdata;Node *pLChild;Node *pRChild;Node *pParent;};classTree{public:Tree();//创建树~Tree();//销毁树Node *SearchNode(intnodeindex);//搜索结点boolAddNode(intnodeindex,intdirection,Node *pNode);//添加结点boolDeleteNode(intnodeindex,Node *pNode);//删除结点voidpreorderTraverse();//先序遍历二叉树voidInorderTraverse();//中序遍历二叉树voidPosorderTraverse();//后序遍历二叉树private:Node *m_pRoot;};Node::Node(){index=0;data=0;pLChild=NULL;pRChild=NULL;pParent=NULL;}Tree::Tree(){m_pRoot=newNode();}Tree::~Tree(){//DeleteNode(0,NULL);//方法一m_pRoot->DeleteNode();//方法二}Node *Node::SearchNode(intnodeindex){if(this->index==nodeindex)returnthis;Node *temp=NULL;if(this->pLChild!=NULL){if(this->pLChild->index==nodeindex)returnthis->pLChild;elsetemp=this->pLChild->SearchNode(nodeindex);}if(this->pRChild!=NULL){if(this->pRChild->index==nodeindex)returnthis->pRChild;elsetemp=this->pRChild->SearchNode(nodeindex);if(temp!=NULL)returntemp;}returnNULL;}Node *Tree::SearchNode(intnodeindex){returnm_pRoot->SearchNode(nodeindex);}boolTree::AddNode(intnodeindex,intdirection,Node *pNode){Node *temp=SearchNode(nodeindex);if(temp==NULL)returnfalse;Node *node=newNode();if(node==NULL)returnfalse;node->index=pNode->index;node->data=pNode->data;node->pParent=temp;if(direction==0)temp->pLChild=node;if(direction==1)temp->pRChild=node;returntrue;}boolTree::DeleteNode(intnodeindex,Node *pNode){Node *temp=SearchNode(nodeindex);if(temp==NULL)returnfalse;if(pNode!=NULL){pNode->data=temp->data;}temp->DeleteNode();returntrue;}voidNode::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;}deletethis;}voidNode::preorderTraverse(){cout <<this->index <<" "<<this->data << endl;if(this->pLChild!=NULL)this->pLChild->preorderTraverse();if(this->pRChild!=NULL)this->pRChild->preorderTraverse();}voidNode::InorderTraverse(){if(this->pLChild!=NULL)this->pLChild->InorderTraverse();cout <<this->index <<" "<<this->data << endl;if(this->pRChild!=NULL)this->pRChild->InorderTraverse();}voidNode::PosorderTraverse(){if(this->pLChild!=NULL)this->pLChild->PosorderTraverse();if(this->pRChild!=NULL)this->pRChild->PosorderTraverse();cout <<this->index <<" "<<this->data << endl;}voidTree::preorderTraverse(){m_pRoot->preorderTraverse();}voidTree::InorderTraverse(){m_pRoot->InorderTraverse();}voidTree::PosorderTraverse(){m_pRoot->PosorderTraverse();}intmain(){Node *node1=newNode();node1->index=1;node1->data=5;Node *node2=newNode();node2->index=2;node2->data=8;Node *node3=newNode();node3->index=3;node3->data=2;Node *node4=newNode();node4->index=4;node4->data=6;Node *node5=newNode();node5->index=5;node5->data=9;Node *node6=newNode();node6->index=6;node6->data=7;Tree *tree=newTree();tree->AddNode(0,0,node1);tree->AddNode(0,1,node2);tree->AddNode(1,0,node3);tree->AddNode(1,1,node4);tree->AddNode(2,0,node5);tree->AddNode(2,1,node6);//printf("删除最后一个结点:\n");//tree->DeleteNode(6,NULL);printf("删除中间某个结点:\n");tree->DeleteNode(2,NULL);// printf("前序遍历的结果:\n");// tree->preorderTraverse();// printf("中序遍历的结果:\n");// tree->InorderTraverse();printf("后序遍历的结果:\n");tree->PosorderTraverse();deletetree;return0;}查看全部 -
【树】节点的有限集合
【度】有几个子节点
【叶子】终端节点
【无序树】同一节点的几个子节点可以随便换顺序而不影响逻辑
【深度】:节点深度(不同层不一样)、树的深度(所有层里节点的最大深度)
【二叉树】所有节点的度都≤2
遍历:前序遍历、中序、后序(前中后是相对于二叉树的根来说的)
前(先访问根,再访问节点),中(左节点、根、右节点)、后(最后访问根)
用途:压缩软件-赫夫曼树、搜索-人机对战
查看全部 -
二叉树的度都小于等于二。
二叉树的遍历是相对于根节点而言的,先访问根节点则为前序遍历,后访问则为后序遍历,中间访问则为中序遍历。
查看全部 -
父亲节点下标*2+1 该节点左 父亲节点下标*2+1 该节点右
查看全部 -
前序遍历:根左右 中序遍历:左根右 后序遍历:左右根查看全部
-
关于数组与树之间的算法转换
查看全部 -
二叉树表示
查看全部 -
二叉树的遍历
查看全部 -
深度的概念
查看全部 -
前序遍历:根左右
中序遍历:左根右
后序遍历:左右根
查看全部 -
NULL定义在头文件stdio.h中
查看全部 -
孩子,双亲,度
什么叫度?
双亲节点的孩子数称为度
什么叫二叉树?
所有节点的度<=2
查看全部 -
二叉树链表!查看全部
-
二叉树编码查看全部
举报