剑指offer-面试题39:二叉树的深度
来源:互联网 发布:菜鸟网络工作怎么样 编辑:程序博客网 时间:2024/04/29 20:29
题目一:输入一颗二叉树的根结点,求该树的深度。从根结点到叶结点一次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
思路:如果根结点存在,那么深度至少为1,接下来求左右子树的深度,很明显用递归算法,最后树的深度就是左右子树中深度较大的加上1.
int DepthOfBinaryTree(BinaryTreeNode* pRoot){ if(pRoot == NULL) return 0; int depthOfLeft = DepthOfBinaryTree(pRoot->m_pLeft); int depthOfRigth = DepthOfBinaryTree(pRoot->m_pRight); int longerChild = depthOfLeft > depthOfRigth ? depthOfLeft : depthOfRigth; return 1 + longerChild;}
题目二:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
思路:很容易想到对每个结点求深度的办法,对每一个结点,调用之前求深度的函数判断它的左右子树深度相差是否超过1。但是这种方式重复遍历了树的结点,深度越大的结点,重复的次数越多。这道题与前面求斐波那契数列的情况颇为类似,在那里我们要求f(10),用递归的办法就得先求出f(9)和f(8),继而再求f(8)和f(7),这样就产生了很多重复计算。那里的解决办法是改变求和的次序,先求f(1),接着求f(2)…这样顺序递推,就避免了重复求和的情况。那么回到本题上,和斐波那契数列类似,我们先不判断根结点是否平衡,而是判断最深的父结点是否平衡,同时记录结点的深度,接着在往上遍历,判断是否平衡,直到上升到根结点,这样就避免了重复对结点求深度的情况,实际上就是一个后序遍历的过程。
bool IsBalanced(BinaryTreeNode* pRoot, int* depth){ if(pRoot == NULL) { *depth = 0; return true; } int left, right; if(IsBalanced(pRoot->m_pLeft, &left) && IsBalanced(pRoot->m_pRight, &right)) { int diff = left - right; if(diff <= 1 && diff >= -1) { *depth = 1 + (left > right ? left : right); return true; } } return false;}bool IsBalanced(BinaryTreeNode* pRoot){ int depth = 0; return IsBalanced(pRoot, &depth);}
0 0
- [剑指offer][面试题39]二叉树的深度
- 【剑指offer】面试题39:二叉树的深度
- 剑指Offer:面试题39 二叉树的深度
- 【剑指Offer学习】【面试题39:二叉树的深度】
- 剑指offer-面试题39:二叉树的深度
- 剑指Offer----面试题39(1):二叉树的深度
- 剑指offer--面试题39:二叉树的深度
- 【剑指offer】面试题39-二叉树的深度
- 剑指Offer-面试题39-二叉树的深度
- 剑指Offer系列-面试题39:二叉树的深度
- 剑指offer-面试题39 : 二叉树的深度
- 剑指offer-面试题39 : 二叉树的深度
- 剑指offer-面试题39-二叉树的深度
- 剑指offer 面试题39 二叉树的深度
- 【剑指Offer】面试题39:二叉树的深度
- 【剑指offer】面试题39:二叉树的深度
- 《剑指Offer》面试题:二叉树的深度
- 剑指offer面试题之求二叉树的深度
- hdu4722 Good Numbers 规律题
- linux中fork()函数详解&&实例讲解
- leetcode之Path Sum
- Linux下 kprobe工具的使用
- ImageView
- 剑指offer-面试题39:二叉树的深度
- 山东省第一届ACM省赛 I SDUT 2159 Ivan comes again!(STL-set)
- linux(5) sudo: unable to resolve host linuxgus 提示
- CQOI2016滚粗记
- Glide使用详解(一)
- elasticsearch2.1.1 安装
- C++学习笔记十三 - C++宏替换认识大小写区分
- 远程通信的几种选择(RPC,Webservice,RMI,JMS的区别)
- 值班管理数据表设计