题目
输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。
思路
如果一棵树只有一个结点,它的深度为1,如果根节点只有左子树而没有右子树,那么树的深度应该是其左子树的深度+1.同样如果根节点只有右子树而没有左子树,那么树的深度应该是其右子树+1.如果既有左子树又有右子树,那概述的深度就是左、右子树的深度的较大值加1。
#include <iostream> using namespace std; struct tree { double data; struct tree *left,*right; tree(int d=0):data(d) { left=right=nullptr; } }; class Solution { public: void create(tree *&root); int depth(tree *root); tree *root; }; void Solution::create(tree *&root) { double x; cin>>x; if(x==0) root=nullptr; else { root=new tree(); root->data=x; create(root->left); create(root->right); } } int Solution::depth(tree *root) { if(!root) return 0; int left=depth(root->left); int right=depth(root->right); return max(left,right)+1; } int main() { Solution s; s.create(s.root); cout<<s.depth(s.root)<<endl; return 0; }
题目
输入一棵二叉树,判断该二叉树是否是平衡二叉树。
思路
如果像去求二叉树的深度那样,先判断根节点是不是平衡的,在判断根的左右子树是不是平衡的,这样的话,会重复遍历很多节点(根的左右子树的子树),所以可以用后序遍历,遍历到根结点之前已经先遍历了左右子树,只需要在便利每个结点的时候记录它的深度,就可以一遍遍历一边判断每个节点是不是平衡的。
#include <iostream> #include <cmath> using namespace std; struct tree { double data; struct tree *left,*right; tree(int d=0):data(d) { left=right=nullptr; } }; class Solution { public: void create(tree *&root); int depth(tree *root); bool is_balance(tree *root); bool is_balance(tree *root,int &n); tree *root; }; void Solution::create(tree *&root) { double x; cin>>x; if(x==0) root=nullptr; else { root=new tree(); root->data=x; create(root->left); create(root->right); } } bool Solution::is_balance(tree *root) { if(!root) return false; int n=0; return is_balance(root,n); } bool Solution::is_balance(tree *root,int &n) { if(!root) { n=0; return true; } int left=0,right=0; if(is_balance(root->left,left)&&is_balance(root->right,right)) { int diff=left-right; if(abs(diff)<=1) { n=max(left,right)+1; return true; } } return false; } int main() { Solution s; s.create(s.root); cout<<boolalpha<<s.is_balance(s.root)<<endl; return 0; }