如何判断一棵二叉树是完全二叉树(2)

我们知道堆也是一棵完全二叉树,一般是由数组来实现的。如果父结点的index是k, 那么它的左子结点index为2k+1, 右子结点的index为2k+2. 一个比较自然的想法就是,给树的每个结点标上index, 每个结点的index必须小于树的总结点数目。

实现如下.

public class TreeNode
{
    public TreeNode(int v)
	{
	    Val = v;
	}

	public int Val { get; private set;}
	public TreeNode Left { get; set; }
	public TreeNode Right { get; set; }
}

public bool IsCompleteBinaryTree(TreeNode root)
{
    int count = CountOfTree(root);
    return IsCompleteBinaryTree(root, 0, count);
}

private int CountOfTree(TreeNode root)
{
    if(root == null) {
	    return 0;
	}
	return 1 + CountOfTree(root.Left) + CountOfTree(root.Right);
}

private bool IsCompleteBinaryTree(TreeNode root, int rootIndex, int totalNodes)
{
    if(root == null) return true;
    if(rootIndex >= totalNodes) {
	    return false;
	}

	return IsCompleteBinaryTree(root.Left, 2* rootIndex+1, totalNodes)
	       && IsCompleteBinaryTree(root.Right, 2* rootIndex+2, totalNodes);

}

  

时间: 2024-10-16 08:18:08

如何判断一棵二叉树是完全二叉树(2)的相关文章

如何判断一棵二叉树是完全二叉树

完全二叉树(Complete Binary Tree): 设二叉树的深度为h,除第 h 层外,其它各层 (1-h-1) 的结点数都达到最大个数,第h层所有的结点都连续集中在最左边,这就是完全二叉树. 解析: 任意的一个二叉树,都可以补成一个满二叉树.这样中间就会有很多空洞.在广度优先遍历的时候,如果是满二叉树,或者完全二叉树,这些空洞是在广度优先的遍历的末尾,所以,但我们遍历到空洞的时候,整个二叉树就已经遍历完成了.而如果,是非完全二叉树, 我们遍历到空洞的时候,就会发现,空洞后面还有没有遍历到

判断一棵二叉树是否是完全二叉树

题目:判断一棵二叉树是否是完全二叉树 思路: 1.首先明确完全二叉树的概念.完全二叉树除最后一层外,所有层结点数均达到最大值,最后一层结点连续集中在最左边.空树也是完全二叉树. 2.我们可以通过层序遍历的方式遍历这个二叉树,使用一个队列存储遍历的结点.可以利用最后一层的结点集中在左侧这个特性解题,具体看代码: 代码: bool isCompleteTree(pTree pT) { Queue q; initQueue(&q); Enqueue(&q,pT);//根入队 pNode ptr

判断一棵二叉树是不是平衡二叉树

二叉树中任意左右子树的深度相差不超过1,那么它就是一棵平衡二叉树. 两种解法. 第一种:菜鸟的解法,出现重复遍历,时间复杂度高. 1 bool IsBalanced(BinaryTreeNode* root) 2 { 3 if (root == NULL) 4 { 5 return true ; 6 } 7 int left = TreeDepth(root->m_pLeft);//该函数实现见我上一篇博客"数的深度" 8 int right = TreeDepth(root-&

编程实现判断一棵二叉树是否是平衡二叉树

Balanced Binary Tree Given a binary tree, determine if it is height-balanced. For this problem, a height-balanced binary tree is defined as a binary tree in which the depth of the two subtrees of every node never differ by more than 1. 思路:遍历这棵二叉树,每访问

比较两棵二叉树--(比较两棵二叉树是否相同/判断一棵二叉树是否是另一棵二叉树的子树)

一,问题介绍 本文章讨论两个问题: ①如何判断两棵二叉树的结构是一样的.对应的每个结点都有着相同的值.--即判断两棵二叉树是一样的 ②给定两棵二叉树,如何判断一棵二叉树是另一棵二叉树的子结构 ③给定两棵二叉树,如何判断一棵二叉树是另一棵二叉树的子树 注意,子结点与子树有那么一点点不同. 上面的二叉树B 是二叉树A 的子结构,但是不能说是二叉树A的子树.但是二叉树C 是 二叉树A的子树. 二,问题分析 1,如何判断两棵二叉树的结构是一样的.且对应的每个结点都有着相同的值. 对于①如何判断两棵二叉树

判断一棵二叉树是否为BST,一棵树是否为完全二叉树

对于一颗搜索二叉树,最简单的方法就是用中序遍历,看是不是一个递增数列,如果是则是一颗搜索二叉树,如果不是则不是搜索二叉树.在这里用一个lastVisit去记录上一次搜索到的节点.整个过程就是先找到最左下角的节点,更新这个lastVisit为这个节点的值,然后按照中序遍历依次更新即可.代码如下. 1 #include <stdio.h> 2 #include <climits> 3 4 //二叉树结点 5 typedef struct binary_tree_node_t{ 6 bi

【面试】判断一棵二叉树是否为二叉排序树

一.描述 给定一棵二叉树,如何判断一棵树是否是二叉排序树.给出树结点定义如下 class TreeNode { int key; TreeNode left; TreeNode right; public TreeNode(int key) { this.key = key; } } 二.解题思路 根据二叉排序树的性质,在进行中序遍历的时候,当前结点的值总是大于前驱结点的值,需要在遍历时保存前驱结点的值,这样有利于进行判断,基于这样的思路来进行解题. 三.代码 根据以上的解题思路(遍历时利用二叉

剑指Offer--040-平衡二叉树(判断一棵二叉树是否是平衡二叉树)[扩展附加题]

链接 牛客OJ:平衡二叉树 九度OJ:未收录 GitHub代码: 040-平衡二叉树 CSDN题解:剑指Offer–040-平衡二叉树 牛客OJ 九度OJ CSDN题解 GitHub代码 040-平衡二叉树 未收录 剑指Offer–040-平衡二叉树 040-平衡二叉树 题意 题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 递归法 根据平衡二叉树的定义 平衡二叉树要求对于每一个节点来说,它的左右子树的高度之差不能超过1 因此我们递归的判断每一个根节点,判断左右子树的高度差 递归得到二叉

C++算法之 求二叉树中叶子节点的个数 与 判断两棵二叉树是否结构相同

//叶子节点的个数 /* (1)如果二叉树为空,返回0 (2)如果二叉树不为空且左右子树为空,返回1 (3)如果二叉树不为空,且左右子树不同时为空,返回左子树中叶子节点个数加上右子树中叶子节点个数 */ int GetLeafNodeNum(BTree* root) { if(root == NULL) return 0; if(root->m_pLeft == NULL && root->m_pRight == NULL) return 1; int LeafNumOfLef