题解 | #判断是不是完全二叉树#

判断是不是完全二叉树

http://www.nowcoder.com/practice/8daa4dff9e36409abba2adbe413d6fae

思路:排除几种错误的类型:空树、除去最后一层其他层没满、最后一层的叶节点不符合要求。解决方案是先根据层序遍历得到分层的、每一层的结点,再分上述情况进行判定。

package main
import . "nc_tools"
import "math"
/*
 * type TreeNode struct {
 *   Val int
 *   Left *TreeNode
 *   Right *TreeNode
 * }
 */

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param root TreeNode类 
 * @return bool布尔型
*/
func isCompleteTree(root *TreeNode) bool {
	// write code here
    //改进的层序遍历,得到每一层的结点
	orderByNode := levelOrderByNode(root)
    //空树直接返回false
	if len(orderByNode) < 1 {
		return false
	}
    //只有一个结点返回true
	if len(orderByNode) == 1 {
		return true
	}
    //对于不包括最后一层的每一层,结点个数应该满足的条件n=2^i
	for i := 0; i < len(orderByNode)-2; i++ {
		if float64(len(orderByNode[i])) != math.Pow(float64(2), float64(i)) {
			return false
		}
	}
    //对于最后一层结点的情况讨论如下:
	for i := 0; i < len(orderByNode[len(orderByNode)-2]); i++ {
    //假设最后一层的上一层的某个结点的左子树为空,
		if orderByNode[len(orderByNode)-2][i].Left == nil  {
        //如果右子树不为空,则不符合要求
			if  orderByNode[len(orderByNode)-2][i].Right != nil {
				return false
			}
            //左右子树均为空,但是后面的结点的左右子树存在,则不符合
			for j := i+1; j <len(orderByNode[len(orderByNode)-2]) ; j++ {
				if orderByNode[len(orderByNode)-2][j].Right != nil || orderByNode[len(orderByNode)-2][j].Left != nil{
					return false
				}
			}
		}
        //假设最后一层的上一层的某个结点的右子树为空,
        if orderByNode[len(orderByNode)-2][i].Right == nil {
        //则后面不应该再有别的叶节点
			for j := i + 1; j < len(orderByNode[len(orderByNode)-2]); j++ {
				if orderByNode[len(orderByNode)-2][j].Right != nil || orderByNode[len(orderByNode)-2][j].Left != nil {
					return false
				}
			}
		}
	}
	return true
}
//层序遍历,获得每一层的结点
func levelOrderByNode(root *TreeNode) [][]*TreeNode {
	result := make([][]*TreeNode, 0)
	var dfs func(*TreeNode, int)
	dfs = func(node *TreeNode, level int) {
		if node == nil {
			return
		}
		if level == len(result) {
			result = append(result, []*TreeNode{})
		}
		result[level] = append(result[level], node)
		dfs(node.Left, level+1)
		dfs(node.Right, level+1)
	}
	dfs(root, 0)
	return result
}

全部评论

相关推荐

来个大佬救一下,为上投了都是石沉大海了,没实习经历的话怕秋招直接进不了面。什么实习这么难找,基本
心态爆炸了:现在正式的岗位都少,实习基本不咋招的,除了大厂,中小企业其实没那么多岗位需求,就算是有,大多都是招一两个廉价劳动力,同时,他们也会希望你一来就能干活的,没时间培训你,就让你了解公司的项目,你了解完就可以开始干活。再者是,很多低质量的实习其实用处没有那么大的。我去年也是找实习找到破防,最后去了一家深圳的小公司实习,工作对我来说很简单,甚至不如我在学校做的项目,秋招的时候,这段实习经历也并没有帮上什么忙,投递简历,依旧非常低的回复率。低回复率是常态,尤其是找实习,找不到,那就把重心放在优化自己的简历和项目,多看八股文,锻炼自己的面试能力,多看别人的面经,自己模拟面试,等秋招的时候,只要有那么寥寥几次,好好抓住那几次机会。
点赞 评论 收藏
分享
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务