• 二叉树的深度与二叉平衡树判断


    我的代码:直接用了以前那个求二叉树某一个条路径的和为特定值的思想
    1. struct TreeNode{
    2. int val;
    3. struct TreeNode *left;
    4. struct TreeNode *right;
    5. };
    1. #ifndef BINARY_TREE_DEEP_H
    2. #define BINARY_TREE_DEEP_H
    3. #include "reconstructBinaryTree.h"
    4. #include<stack>
    5. #include<set>
    6. void treeDeepCore(TreeNode *node ,std::stack<TreeNode*> &v_stack,std::set<int> &v_set);
    7. int getBinaryTreeDeep(TreeNode **root){
    8. if(root==NULL||*root==NULL){
    9. return 0;
    10. }
    11. std::stack<TreeNode*> g_stack;
    12. std::set<int> g_set;
    13. treeDeepCore(*root,g_stack,g_set);
    14. std::cout<<*(g_set.begin())<<std::endl;
    15. return *(g_set.rbegin());
    16. }
    17. void treeDeepCore(TreeNode *node ,std::stack<TreeNode*> &v_stack,std::set<int> &v_set){
    18. if(node==NULL){
    19. return;
    20. }
    21. v_stack.push(node);
    22. if(node->left==NULL&&node->right==NULL){
    23. v_set.insert(v_stack.size());
    24. }
    25. treeDeepCore(node->left,v_stack,v_set);
    26. treeDeepCore(node->right,v_stack,v_set);
    27. if(!v_stack.empty()){
    28. v_stack.pop();
    29. }
    30. }
    31. #endif
    1. #include"binaryTreeDeep.h"
    2. int main(){
    3. int pre[8]={1,2,4,7,3,5,6,8};
    4. int mid[8]={4,7,2,1,5,3,8,6};
    5. struct TreeNode *root=reconstructBinaryTree(pre,mid,8); //重建二叉树
    6. std::cout<<getBinaryTreeDeep(&root);
    7. }

    如上图中,求棵树的深度我们其实可以这样,无非就是求最大路径的长度嘛,用递归的思想就可以解决这个问题了。
    你看最大深度无非就是以下几种情况:
    左子树为空,右子树不为空:深度为左子树的深度加1嘛
    左子树不为空,右子树为空:深度为右子树的深度加1嘛
    左右子树都不为空:               深度为两者中最大的深度为1嘛

    1. int binaryTreeDeepCore(TreeNode *node){
    2. if(node==NULL){
    3. return 0;
    4. }
    5. int leftDeep=binaryTreeDeepCore(node->left);
    6. int rightDeep=binaryTreeDeepCore(node->right);
    7. return (leftDeep>rightDeep)? (leftDeep+1):(rightDeep+1);
    8. }
    在这个基础上判断一棵树是不是平衡二叉树,于是知,也就是看一棵树是否存在两个左右节点深度差大于1嘛。
    1. #ifndef IS_BALANCETREE_H
    2. #define IS_BALANCETREE_H
    3. #include"reconstructBinaryTree.h"
    4. int binaryTreeDeepCore(TreeNode *node);
    5. bool isBalanceBT(TreeNode *root){
    6. if(root==NULL){
    7. return true;
    8. }
    9. int leftDeep=binaryTreeDeepCore(root->left);
    10. int rightDeep=binaryTreeDeepCore(root->right);
    11. int diffDeep=leftDeep-rightDeep;
    12. if(diffDeep>1||diffDeep<-1)
    13. return false;
    14. return binaryTreeDeepCore(root->left)&&binaryTreeDeepCore(root->right);
    15. }
    16. int binaryTreeDeepCore(TreeNode *node){
    17. if(node==NULL){
    18. return 0;
    19. }
    20. int leftDeep=binaryTreeDeepCore(node->left);
    21. int rightDeep=binaryTreeDeepCore(node->right);
    22. return (leftDeep>rightDeep)? (leftDeep+1):(rightDeep+1);
    23. }
    24. #endif






  • 相关阅读:
    树线段hdu 4508 美素数(线段树)
    自定义context自定义Dialog之Progress(二)
    实现语言C语言简单实现五子棋
    调用博客paip.基于HTML gui界面的javascript JS实现SLEEP。。
    水印控件windows phone中,制作一个自定义的密码输入框控件,含图片,有水印,星号显示
    请求网络网络编程
    调试网页PAIP HTML的调试与分析工具
    输出流输入输入输出流
    标记协议http协议与XML书写规范及解析技术
    描述算法10673 Play with Floor and Ceil
  • 原文地址:https://www.cnblogs.com/yml435/p/4655471.html
Copyright © 2020-2023  润新知