1、struct BiTNode *lchild,*rchild; /左右孩子BiTNode,*BiTree;/先序输入二叉树结点的值,空格表示空树void createBiTree(BiTree &T)char ch; / 输入结点时用scanf(%c,&ch);if(ch= ) / 若输入空格,该值为空 ,且没有左右孩子T=NULL;elseT=(BiTNode *)malloc(sizeof(BiTNode); /分派结点空间if(!T) /分派失败exit(OVERFLOW);T-data=ch; / 生成根结点createBiTree(T-lchild); / 结构左子树rchild);
2、 / 结构右子树/递归方法先序遍历二叉树void preOrderTraverse(BiTree T)if(T) /若非空if(T-data)/输出 printf(,T-data);preOrderTraverse(T-/递归方法中序遍历二叉树void inOrderTraverse(BiTree T)/递归方法后序遍历二叉树void postOrderTraverse(BiTree T)/层序遍历二叉树void LevelTraverse(BiTree T)queue q;/ 建队q.push(T);/ 根节点入队BiTree p;while(!q.empty()p=q.front(); /
3、 获取行列的首元素q.pop(); / 首元素出队coutdatalchild!=NULL) / 若结点的左孩子不空q.push(p-rchild!=NULL)/ 若结点的右孩子不空/非递归方法前序遍历二叉树void stackPreOrderTraverse(BiTree T)stacks.push(p- / 左孩子入栈 ,直到走到终点s.pop(); /空指针出栈p=s.top();/ 获取栈顶元素 /出栈 / 右孩子入栈/非递归方法中序遍历二叉树void stackInOrderTraverse(BiTree T) /建栈/入栈/非递归方法后序遍历二叉树void stackPostOrd
4、erTraverse(BiTree T)map m; / 标志结点能否已经输出 /栈首元素if(T) /若不是空树 /根结点入栈while(true)/ 目的:找到后序遍历要输出的结点lchild&!mp-lchild)/若左孩子未输出,将左孩子入栈,直到终点,不包含空指针 s.push(p-if(p=s.top()&rchild&rchild)/若最左孩子的右孩子未输出且非空,则入栈 s.push(p-break; /找到结点跳出循环mp)mp=true; /标志已经输出 /退栈/后序遍历求二叉树的高度递归算法int PostTreeDepth(BiTree T)int hl,hr,max;
5、if(T!=NULL)hl=PostTreeDepth(T- / 求左子树的深度hr=PostTreeDepth(T- / 求右子树的深度max=hlhr?hl:hr; / 获取左、右子树深度较大者return(max+1); /返回树的深度elsereturn(0); / 假如是空树,则返回 0/* 按竖向树状打印的二叉树代码是为了实现二叉树的横向显示问题。这类树形要求先打印右子树,再打印根,最后打印左子树,次序恰为逆中序次序。这类输出格式,结点的左右地点与结点的层深相关,故算法中设置了一个表示目前根节点层深的参数,以控制输出结点的左右地点。 */void PrintTree(BiTree
6、T,int nLayer)int i;if(T=NULL) return;PrintTree(T-rchild,nLayer+1);for(i=0;ireturn LeafNum;int main()BiTree T; /定义结点int layer=0;/ 层数 输入二叉树结点值空格表示空树:endl;createBiTree(T); 递归先序遍历 :preOrderTraverse(T); 递归中序遍历 :inOrderTraverse(T); 递归后序遍历 :postOrderTraverse(T); 层序遍历:LevelTraverse(T); 非递归先序遍历:stackPreOrderTraverse(T); 非递归中序遍历:stackInOrderTraverse(T); 非递归后序遍历:stackPostOrderTraverse(T); 叶子结点为: 叶子结点个数为:TreeLeaf(T) 树的的深度:layer=PostTreeDepth(T);layer 二叉树的树形结构图:PrintTree(T,layer);return 0; BiTree p;/ 标志结点能否已经输出/若不是空树找到后序遍历要输出的结点 while(p=s.top()&/若最左孩子的右孩子未输出且非空,则入栈
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1