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



我的代码:直接用了以前那个求二叉树某一个条路径的和为特定值的思想

源代码

  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

来自为知笔记(Wiz)

时间: 2024-08-07 16:48:47

二叉树的深度与二叉平衡树判断的相关文章

二叉树遍历的应用(路径和问题,判断是否是二叉搜索树,判断是否是二叉平衡树)

现在越发觉得关于树的问题真是千变万化,随便改一个条件又会是一个新的问题. 先序遍历求二叉树路径问题 问题:一棵二叉树每个节点包含一个整数,请设计一个算法输出所有满足条件的路径:此路径上所有节点之和等于给定值.注意此类路径不要求必须从根节点开始. 如果没有最后一个条件,这道题在leetcode上面见过,就是采取先序遍历的方式并记录下路径.但是加上最后一个条件后需要转下弯思考一下. 当然也需要记录下路径,并且记得要回溯.加上不要求从根节点开始这个条件后可以这么思考,每次遍历到当前节点时,从路径中查找

判断一颗二叉树是否为二叉平衡树 python 代码

输入一颗二叉树,判断这棵树是否为二叉平衡树.首先来看一下二叉平衡树的概念:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树.因此判断一颗二叉平衡树的关键在于求出左右子树的高度差,而二叉树的高度又是怎么定义的呢?二叉树的高度指的是从根节点到叶子节点所有路径上包含节点个数的最大值.所以我们可以得出,父亲节点的高度与左右子树高度的关系为:父亲节点的高度=max(左子树高度,右子树高度)+1,同时我们知道,叶子节点的高度值为1(或则0,这里定义1或者0对判断结

二叉树--二叉平衡树

二叉平衡树是二叉树中最为最要的概念之一,也是在语言库或者项目中应用比较广泛的一种特殊的树形结构. 二叉平衡树 AVL树是高度平衡的而二叉树.它的特点是:AVL树中任何节点的两个子树的高度最大差别为1. 通常AVL树是在二叉搜索树上,经过局部调整而建立的,因此,它还是一棵排序树. 上面的两张图片,左边的是AVL树,它的任何节点的两个子树的高度差别都<=1:而右边的不是AVL树,因为7的两颗子树的高度相差为2(以2为根节点的树的高度是3,而以8为根节点的树的高度是1). 性质 左右子树相差不超过1.

二叉平衡树的插入和删除操作

1.      二叉平衡树 二叉排序树的时间复杂度和树的深度n有关.当先后插入的结点按关键字有序时,二叉排序树退化为单枝树,平均查找长度为(n+1)/2,查找效率比较低.提高查找效率,关键在于最大限度地降低树的深度n.因此需要在构成二叉排序树的过程中进行“平衡化”处理,使之成为二叉平衡树. 二叉平衡树,又称AVL树.它或者是一棵空树,或者是具有下列性质的树: 1)      具备二叉排序树的所有性质: 2)      左子树和右子树深度差的绝对值不超过1: 3)      左子树和右子树都是二叉

二叉平衡树之删除节点

二叉平衡树之删除节点操作 更好的判断最小非平衡树类型的方法 在前一篇文章中,我们知道最小非平衡树可以分为四种类型,即:LL型.LR型.RR型和RL型.而且我也按照自己的理解,归纳了判断是哪种类型的方法.总结一下就是:设最小非平衡树的树根为unbalance,首先看unbalance的左右子树谁更高,如果左子树更高则为LX型.如果是右子树高则为RX型.再进一步,如果为LX型,将刚刚插入的节点的值value与unbalance左孩子进行比较,如果value大则为LR型,如果value小则为LL型.如

java项目---用java实现二叉平衡树(AVL树)并打印结果(详)

1 package Demo; 2 3 public class AVLtree { 4 private Node root; //首先定义根节点 5 6 private static class Node{ //定义Node指针参数 7 private int key; //节点 8 private int balance; //平衡值 9 private int height; //树的高度 10 private Node left; //左节点 11 private Node right;

数据结构第三部分:树与树的表示、二叉树及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树、集合及其运算

参考:浙大数据结构(陈越.何钦铭)课件 1.树与树的表示 什么是树? 客观世界中许多事物存在层次关系 人类社会家谱 社会组织结构 图书信息管理 分层次组织在管理上具有更高的效率! 数据管理的基本操作之一:查找(根据某个给定关键字K,从集合R 中找出关键字与K 相同的记录).一个自然的问题就是,如何实现有效率的查找? 静态查找:集合中记录是固定的,没有插入和删除操作,只有查找 动态查找:集合中记录是动态变化的,除查找,还可能发生插入和删除 静态查找——方法一:顺序查找(时间复杂度O(n)) int

二叉树进阶之寻找一棵二叉树中的最大二叉搜索子树

转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6618915.html  (规律:在二叉树中寻找某性质的,都应该以递归思维:从根结点开始递归左右,一直到底,由底向上返回的信息来判断当前结点.求当前结点.即:二叉树的题目,从下往上想,递归的返回过程就是从下往上由叶到根建立二叉树的过程,在此过程中对每一步的"根"结点作性质判断,返回到根时即是整棵树的性质判断了) 从一棵树中寻找结点数最多的二叉搜索子树,并返回这棵子树的头结点. 从题目我们知道以下要求

【算法导论学习-24】二叉树专题2:二叉搜索树(Binary Search Tree,BST)

一.   二叉搜索树(Binary SearchTree,BST) 对应<算法导论>第12章.相比一般二叉树,BST满足唯一的条件:任意节点的key>左孩子的key,同时<右孩子的key. 1.     节点类: public class BinarySearchTreesNode<T> { private int key; private T satelliteData; private BinarySearchTreesNode<T> parent, l