首页 > 编程知识 正文

矩阵的等价的定义,满二叉树一定是完全二叉树

时间:2023-05-03 21:10:19 阅读:156094 作者:2490

文章目录由二叉树覆盖,平衡完全二叉树和二叉树的二叉树等价于二叉树

满是二叉树

题目描述:

利用二叉树的链表记忆,设计算法来判断二叉树是否充满二叉树。

算法思想:

二叉树是一种深度为h、节点数为2h-1的二叉树。

因此,首先考虑的算法思路是求出二叉树的高度h,看其总结点数是否等于2h-1。

实现代码:

1首先给出求二叉树高度的算法。 这里给出递归求解的算法。 非递归算法可以参照递归算法和非递归算法求解二叉树的高度

//二叉树的高度intgetdepth(bnode*root ) if ) root==null ) { return 0; }intleft=getdepth(root-lchild ); intright=getdepth(root-rchild ); return leftright? left 1 : right 1; } 2二叉树中节点个数的计算也使用递归算法。 该算法的想法是,如果二叉树为空,则返回节点数0,否则函数在根的左部分树和右部分树中包含的节点个数之和上加1。

//二叉树的节点数intcountnode(bnode*root ) if ) root==null ) return 0; 电子计数节点(root-rchild )计数节点(root-rchild ) 1; } 3那么,判断一棵二叉树是否充满二叉树的函数是

//判断是否为二叉树覆盖的boolisfull(bnode*root ) inth=getdepth ) root )的intsum=countnode(root; if(sum==(pow ) 2,h )-1 ) )返回true; else return false; }

二叉树题目描述:

利用二叉树的链表记忆,设计算法来判断二叉树是否为完全二叉树。

算法思想:

采用层序遍历算法对所有包含空节点的节点进行排队。 如果遇到空节点,则查询之后是否存在非空节点,如果存在,则二叉树不是完全二叉树。

实现代码:

booliscomplete(bnode*root ) { queueBNode * node; if(root==null )//空树满二叉树的return true; node.push(root; //根节点位于堆栈while (! node.empty () ) { BNode *p=node.front; node.pop (; if(p!=null(//节点不为空,其左右子树为node.push(p-lchild ); node.push(p-rchild; (else ) /如果节点为空,则后跟非空节点while (! node.empty () ) { BNode *p=node.front; node.pop (; if(p!=null(//如果节点不为空,二叉树为不完全二叉树return false; } } } return true; }

二叉树题目描述:

利用二叉树的链表记忆,设计算法来判断一个二叉树是否为平衡二叉树。 平衡二叉树是指左边的孩子和右边的孩子的高度差在1以下。

算法思想:

采用二叉树高度递归算法实现。 如果一个节点左右子树的高度差为1、-1、0,则算法返回true,否则返回false。

根据二叉树逆向扫描的思路,在扫描一个节点之前已经扫描了其左右子树,扫描每个节点时记录其深度,可以在扫描的同时判断每个节点是否平衡。

穿越某个节点的左右节点后,根据左右子节点的深度判断是否平衡,可以得到当前该节点的深度。 追溯根节点,可以判断该二叉树是否为平衡二叉树。

实现代码:

boolisbalance(bnode*root,int height ) if ) root==null ) /空树高度为0,平衡height=0; return t

rue; } int left,right; if(IsBalance(root->lchild, left) == false) return false; if(IsBalance(root->rchild, right) == false) return false; height = (left>right) ? left+1 : right+1; if(abs(left-right) <= 1) return true; else return false;}
相似二叉树

题目描述:
 设二叉树采用二叉链表存储,设计一个算法,判断两棵二叉树是否相似。
 所谓二叉树T1和T2相似,指的是T1和T2都是空的二叉树或都只有一个根结点;或二叉树T1的左子树和T2的左子树是相似的,且T1的右子树和T2的右子树是相似的。

算法思想:
 采用递归的思想求解,若T1和T2都是空树,则相似;若有一个为空另一个不空,则必然不相似;否则递归的比较它们的左、右子树是否相似。

实现代码:

bool IsSimilar(BNode *root1, BNode *root2){ int left,right; if(root1==NULL && root2==NULL){ return true; }else if(root1==NULL || root2==NULL){ return false; }else{ left = IsSimilar(root1->lchild, root2->lchild); right = IsSimilar(root1->rchild, root2->rchild); return left&&right; }}
等价二叉树

题目描述:
 设二叉树采用二叉链表存储,设计一个算法,判断两棵二叉树是否等价。
 所谓两棵二叉树等价,是指二叉树T1和T2不仅在树形上相似,且对应结点的元素值都相等,则称这两棵二叉树等价。

算法思想:
 采用递归的方法求解。若二叉树T1和二叉树T2都为空,则它们等价。如果两棵二叉树T1和T2中有一棵为空另一棵不为空,则它们不等价。当它们都不为空时判断根结点的元素值是否对应相等,若不是,则两棵二叉树不等价;若是,则继续判断它们的左子树和右子树是否等价,若它们都等价,则最后两个二叉树等价。

实现代码:

bool IsEqual(BNode *root1, BNode *root2){ if(root1==NULL && root2==NULL) return true; else if(root1==NULL || root2==NULL) return false; else if(root1->data != root2->data) return false; else if(IsEqual(root1->lchild, root2->lchild) && IsEqual(root1->rchild, root2->rchild)) return true; else return false;}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。