剑指Offer37 二叉树深度与平衡二叉树判断

  1 /*************************************************************************
  2     > File Name: 37_TreeDepth.cpp
  3     > Author: Juntaran
  4     > Mail: [email protected]
  5     > Created Time: 2016年09月03日 星期六 09时49分38秒
  6  ************************************************************************/
  7
  8 #include <stdio.h>
  9 #include <malloc.h>
 10 #include <math.h>
 11
 12 // 二叉树结构体
 13 struct BinaryTree
 14 {
 15     int val;
 16     struct BinaryTree* left;
 17     struct BinaryTree* right;
 18 };
 19
 20 BinaryTree* createTree()
 21 {
 22     BinaryTree* root = (BinaryTree*)malloc(sizeof(BinaryTree));
 23     root->val = 1;
 24     root->left = (BinaryTree*)malloc(sizeof(BinaryTree));
 25     root->left->val = 2;
 26     root->right = (BinaryTree*)malloc(sizeof(BinaryTree));
 27     root->right->val = 3;
 28     root->left->left = (BinaryTree*)malloc(sizeof(BinaryTree));
 29     root->left->left->val = 4;
 30     root->left->left->left = NULL;
 31     root->left->left->right = NULL;
 32     root->left->right = (BinaryTree*)malloc(sizeof(BinaryTree));
 33     root->left->right->val = 5;
 34     root->left->right->right = NULL;
 35     root->left->right->left = (BinaryTree*)malloc(sizeof(BinaryTree));
 36     root->left->right->left->val = 7;
 37     root->left->right->left->left = NULL;
 38     root->left->right->left->right = NULL;
 39     root->right->right = (BinaryTree*)malloc(sizeof(BinaryTree));
 40     root->right->right->val = 6;
 41     root->right->left = NULL;
 42     root->right->right->left = NULL;
 43     root->right->right->right = NULL;
 44     // root->right->right->right = (BinaryTree*)malloc(sizeof(BinaryTree));
 45     // root->right->right->right->val = 8;
 46     // root->right->right->right->left = root->right->right->right->right = NULL;
 47
 48     return root;
 49 }
 50
 51 // 二叉树中序遍历
 52 void InOrder(BinaryTree* root)
 53 {
 54     if (root == NULL)
 55         return;
 56
 57     InOrder(root->left);
 58     printf("%d ", root->val);
 59     InOrder(root->right);
 60 }
 61
 62 // 二叉树的深度
 63 int TreeDepth(BinaryTree* root)
 64 {
 65     if (root == NULL)
 66         return 0;
 67
 68     int left  = TreeDepth(root->left);
 69     int right = TreeDepth(root->right);
 70
 71     return (left>right) ? (left+1) : (right+1);
 72 }
 73
 74 // 判断一棵树是不是平衡二叉树
 75 bool isBalanced(BinaryTree* root)
 76 {
 77     if (root == NULL)
 78         return true;
 79
 80     int left  = TreeDepth(root->left);
 81     int right = TreeDepth(root->right);
 82
 83     int diff = abs(left - right);
 84     if (diff > 1)
 85         return false;
 86
 87     return isBalanced(root->left) && isBalanced(root->right);
 88 }
 89
 90 // 后序遍历方法
 91 bool isBalanced2(BinaryTree* root, int* depth)
 92 {
 93     if (root == NULL)
 94     {
 95         *depth = 0;
 96         return true;
 97     }
 98     int left, right;
 99     if (isBalanced2(root->left, &left) && isBalanced2(root->right, &right))
100     {
101         int diff = abs(left - right);
102         if (diff <= 1)
103         {
104             *depth = 1 + (left>right ? left : right);
105             return true;
106         }
107     }
108     return false;
109 }
110
111 bool isBalanced2(BinaryTree* root)
112 {
113     int depth = 0;
114     return isBalanced2(root, &depth);
115 }
116
117
118
119 int main()
120 {
121     BinaryTree* test = createTree();
122     InOrder(test);
123     int depth = TreeDepth(test);
124     printf("\ndepth is %d\n", depth);
125     if (isBalanced2(test) == true)
126         printf("Balance\n");
127     else
128         printf("No Balance\n");
129
130 }
时间: 2024-10-12 18:53:45

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

剑指offer-37 序列化二叉树

剑指offer-37 序列化二叉树 题目: 思路: 自己解答: 这个有错误 public class Solution { String Serialize(TreeNode root) { if(root == null) return "#!"; StringBuilder bd = new StringBuilder(); serializeCore(root, bd); return bd.toString(); } private void serializeCore(Tre

剑指offer-8 二叉树的下一个节点

剑指offer-8 二叉树的下一个节点 题目: 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 思路: 右侧有节点,直接打印 右侧没节点 此节点的父节点的左节点是自己,打印 此节点的父节点的右节点是自己,向上继续找,直到满足2.1 自己解答: /* public class TreeLinkNode { int val; TreeLinkNode left = null; TreeLinkNode right

剑指offer(四十七)之平衡二叉树

题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 代码: public class Solution { public boolean IsBalanced_Solution(TreeNode root) { if (root == null) return true; if (Math.abs(getHeight(root.left) - getHeight(root.right)) > 1) return false; return IsBalanced_Solution(root.

剑指Offer二叉树的深度

package Tree; import java.util.LinkedList; import java.util.Queue; /** * 二叉树的深度 * 输入一棵二叉树,求该树的深度. * 从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. */ public class Solution13 { public static void main(String[] args) { int[] array = {1, 2, 3, 4, 5, 6, 7

剑指offer--45.二叉树的深度

时间限制:1秒 空间限制:32768K 热度指数:139716 题目描述 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/ class Solution {

剑指Offer——二叉树的深度

1.题目描述 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 2.代码实现 public int TreeDepth(TreeNode root) { if (root == null) { return 0; } int left_len = TreeDepth(root.left); int right_len = TreeDepth(root.right); return Math.max(left_len, rig

剑指offer系列43---判断平衡二叉树

[题目]判断一颗二叉树是不是平衡二叉树. * 平衡二叉树定义:任意子节点深度相差不超过1.[思路]由上题,利用递归得到二叉树每个结点的深度同时比较. 1 package com.exe9.offer; 2 3 import com.exe9.offer.BTreeDepth.TreeNode; 4 5 /** 6 * [题目]判断一颗二叉树是不是平衡二叉树. 7 * 平衡二叉树定义:任意子节点深度相差不超过1. 8 * [思路]由上题,利用递归得到二叉树每个结点的深度同时比较. 9 * @aut

acwing 70-72 剑指OFFER 二叉树相关

地址 https://www.acwing.com/problem/content/66/ https://www.acwing.com/problem/content/67/ https://www.acwing.com/problem/content/submission/68/ 三道题都是二叉树相关 使用递归遍历即可解决 70. 二叉搜索树的第k个结点 给定一棵二叉搜索树,请找出其中的第k小的结点. 你可以假设树和k都存在,并且1≤k≤树的总结点数. 输入 输入:root = [2, 1,

二叉树深度和平衡二叉树的判定

二叉树的深度 对于二叉树的深度的求解,利用递归的方式求解很简单: 下面就来设计这个递归算法: 要求一个节点的高度,先求左子树的高度,然后再求解右子树的高度. 最后树的高度就是1+max(left_depth, right_depth). int leftLen = depth_tree(root->left); int rightLen = depth_tree(root->right); return 1 + max(leftLen, rightLen); 那么这个递归的出口是什么: (1)