二叉树应用_二叉树深度

妖狐艹你老母 2022-05-22 03:41 429阅读 0赞

题目:输入一颗二叉树的根节点,求该树的深度。
分析:方法一:在二叉树中和为某一值的路径中已经知道了如何存取树的一条路径,这里我们可以用此方法求出树的最长路径,也就是树的深度。方法二:树的深度即是左、右子树中深度较大的值加1,可以采用此方法进行递归。
方法一实现如下:

  1. /*
  2. struct TreeNode {
  3. int val;
  4. struct TreeNode *left;
  5. struct TreeNode *right;
  6. TreeNode(int x) :
  7. val(x), left(NULL), right(NULL) {
  8. }
  9. };*/
  10. int TreeDepth(TreeNode*root)
  11. {
  12. if(!root)
  13. return 0;
  14. vector<int> path;
  15. int maxlength=0;
  16. return findpath(root,path,maxlength);
  17. }
  18. int findpath(TreeNode*root,vector<int>&path,int &maxlength)
  19. {
  20. path.push_back(root->val);
  21. if(!root->left&&!root->right)
  22. {
  23. if(maxlength<path.size())
  24. maxlength=path.size();
  25. }
  26. if(root->left)
  27. findpath(root->left,path,maxlength);
  28. if(root->right)
  29. findpath(root->right,path,maxlength);
  30. path.pop_back();
  31. return maxlength;
  32. }

方法二,实现如下:

  1. /*
  2. struct TreeNode {
  3. int val;
  4. struct TreeNode *left;
  5. struct TreeNode *right;
  6. TreeNode(int x) :
  7. val(x), left(NULL), right(NULL) {
  8. }
  9. };*/
  10. int TreeDepth(TreeNode*root)
  11. {
  12. if(!root)
  13. return 0;
  14. int left_depth=TreeDepth(root->left);
  15. int right_depth=TreeDepth(root->right);
  16. return left_depth>right_depth? (left_depth+1):(right_depth+1);
  17. }

题目二:输入一颗二叉树的根节点,判断该二叉树是不是平衡二叉树。二叉树的任意节点的左右子树的高度之差不超过一即为平衡二叉树。
分析:方法一:借助上面求树深度的方法,我们可以求每一个节点左、右子树的深度并且判断两者相差是否超过一,来判断是否为平衡二叉树。
实现如下:

  1. /*
  2. struct TreeNode {
  3. int val;
  4. struct TreeNode *left;
  5. struct TreeNode *right;
  6. TreeNode(int x) :
  7. val(x), left(NULL), right(NULL) {
  8. }
  9. };*/
  10. bool isBanlanced(TreeNode*root)
  11. {
  12. if(!root)
  13. return true;
  14. int left_depth=TreeDepth(root->left);
  15. int right_depth=TreeDepth(root->right);
  16. int diff=left_depth-right_depth;
  17. if(diff>1||diff<-1)
  18. return false;
  19. return isBanlanced(root->left)&&isBanlanced(root->right);
  20. }

方法二:上述方法虽然简单,但是一个节点会被重复遍历,当我们判断一个节点是否是平衡的时候要判断它的左右子树,这样做的效率不高。我们可以采用后序遍历的方式,在遍历到一个节点的时候我们呢已经遍历了他的左右子树。在我们求树的深度时,记录出每个节点的高度,就可以一边遍历一边判断每个节点是不是平衡的。
实现如下:

  1. /*
  2. struct TreeNode {
  3. int val;
  4. struct TreeNode *left;
  5. struct TreeNode *right;
  6. TreeNode(int x) :
  7. val(x), left(NULL), right(NULL) {
  8. }
  9. };*/
  10. bool isBanlanced(TreeNode*root,int &pdepth)
  11. {
  12. if(root==NULL)
  13. {
  14. pdepth=0;
  15. return true;
  16. }
  17. int left_length=0;
  18. int right_length=0;
  19. if(isBanlanced(root->left,left_length)&&isBanlanced(root->right,right_length))
  20. {
  21. int diff=left-right;
  22. if(diff>=-1&&diff<=1)
  23. {
  24. pdepth=1+(left_length>right_length?left_length:right_length);
  25. return true;
  26. }
  27. }
  28. return false;
  29. }
  30. bool isBanlanced(TreeNode*root)
  31. {
  32. int pdepth=0;
  33. return isBanlanced(root,pdepth);
  34. }

发表评论

表情:
评论列表 (有 0 条评论,429人围观)

还没有评论,来说两句吧...

相关阅读

    相关 深度

    输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。 递归: / struct Tree

    相关 应用_深度

    题目:输入一颗二叉树的根节点,求该树的深度。 分析:方法一:在[二叉树中和为某一值的路径][Link 1]中已经知道了如何存取树的一条路径,这里我们可以用此方法求出树的最长

    相关 应用_打印

    题目:从上往下打印二叉树的每个节点,同一层的节点按照从左往右的顺序打印。 分析:每次打印一个节点的时候,如果该节点有子节点,就把该节点的子节点放到一个队列的末尾。每次打印队

    相关 应用_重建

    题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列\{1,2,4,7,3,5,6,8