www.ylrr.net > 编写程序判别给定二叉树是否为完全二叉树。

编写程序判别给定二叉树是否为完全二叉树。

int JudgeComplete(BiTree bt) //判断二叉树e79fa5e98193e59b9ee7ad9431333330336238是否是完全二叉树,如是,返回1,否则,返回0 {int tag=0; BiTree p=bt, Q[]; // Q是队列,元素是二叉树结点指针,容量足够大 if(p==null) return (1);

思路:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉排序树.递归遍历就可以了,反正就是左孩子的key比根节点的key

完全二叉树中,任意结点的左、右子树的深度都相等,所以你只需做一个后根遍历,即可知道一个二叉树是否为完全二叉树;下面假设二叉树的结点结构是:typedef struct _node { _node* lchild; _node* rchild; }binarytree; 用vc编程,算法如下:

#include <stdio.h> #define MaxNum 10000 BinTree buildTree(elementype BT[],int i , int n) { BinTree r; if(i>n) return(NULL); r=(BinTree)malloc(sizeof(BinNode)); r->data=BT[i]; r->Lchild=buildTree(BT,2*i,n); r->Rchild=buildTree(BT,2*i+1,n); return(r); }

我写一下算法的伪代码,首先建好了一颗二叉树,,肯定有树根,假设叫 tree把tree 结点入队当队列不为空的时候,反复执行下面的操作,直到队列为空{把队列里面的结点依次次拿出来,开辟一个数组,记录全部孩子的情况, 根据完全二叉树的定义,孩子一定要是连续的, 如果发现出来的孩子不连续, 那么就不是完全二叉树了}

给你讲讲方法吧,实现就自己写了.完全二叉树(complete binary tree): 若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的节点都连续集中在最左边,这就是完全二叉树.判断很简单,广度优先搜索整个二叉树,一旦找一个不含有子节点或者只含有一个左子节点之后,那么后续的所有节点都必须是叶子节点.否则,该树就不是完全二叉树.实现的时候要用到队列.

是正确的晕~~~~方法是用多对二叉树进行广度搜索,搜索过程中计算每层不为空的连续节点个数,例如在第lev层,节点个数必须为(1<<lev)个,如果没有达到e68a84e8a2ad62616964757a686964616f31333332636263,则在判断,如

现在只说下原理,明天再编出来:树的深度为K,则完全二叉树的小于k-1的层中,节点全部存在,并且,在第K层中(最后一层),到最右节点,没有存在空位置#include <iostream>//完全二叉树// 0// / \// 1 2// / \ / // 3 4 5 class Node{};int main(){

#include <stdio.h>#include <stdlib.h>#define Max 100 typedef struct Node { char data; struct Node * LChild,*RChild;}BiTNode,*BiTree; void CreateBiTree(BiTree * bt) { char ch; ch=getchar(); if(ch==10)ch=getchar();//如果为 回车换行 读取下一个

若某二叉树的前序遍历访问顺序是abdgcefh,中序遍历访问顺序是dgbaechf,则其后序遍历的结点访问顺序是根据前序知道a为根,在中序中分出左子树由dgb组成,右子树由echf组成.由前序知道b为左子树根.c为右子树的根.这样结合着看就可以画出整颗树,然后在写出后序遍历就可以了.

网站地图

All rights reserved Powered by www.ylrr.net

copyright ©right 2010-2021。
www.ylrr.net内容来自网络,如有侵犯请联系客服。zhit325@qq.com