设计素材网站版权问题,一个云主机可以做多少网站,wordpress文章添加表情,智能模板网站建设收费文章目录概念代码实现判断一棵二叉树是否为平衡树概念
平衡树(Balance Tree#xff0c;BT) 指的是#xff0c;任意节点的子树的高度差都小于等于1。
常见的符合平衡树的有#xff1a;
B树#xff08;多路平衡搜索树#xff09;AVL树#xff08;二叉平衡搜索树#xf…
文章目录概念代码实现判断一棵二叉树是否为平衡树概念
平衡树(Balance TreeBT) 指的是任意节点的子树的高度差都小于等于1。
常见的符合平衡树的有
B树多路平衡搜索树AVL树二叉平衡搜索树红黑树 自平衡二叉查找树AVL树的特化
代码实现判断一棵二叉树是否为平衡树 从上到下判断DFS先序遍历 depth 函数计算当前节点cur的深度
返回值 通过后序遍历的方式实现深度计算。终止条件 空节点深度为0。
isBalanced 函数实现判断
返回值 先判断 当前子树 是不是平衡树再判断 左右子树 是不是平衡树先序遍历递归根左右。终止条件 空节点当然是平衡树。
/*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
class Solution {int depth(TreeNode* cur){ // 计算cur深度if(!cur) return 0;return max(depth(cur-right), depth(cur-left)) 1;}
public:bool isBalanced(TreeNode* root) {if(root nullptr) return true;return abs(depth(root-left) - depth(root-right)) 1 isBalanced(root-left) isBalanced(root-right);}
};从下到上判断DFS后序遍历 fun 函数实现后序遍历剪枝
返回值
当 cur 的左 / 右子树的深度差 ≤1 时表明 当前子树仍为平衡树返回当前子树的深度即 左 / 右子树的深度最大值 1 max(left, right) 1 当 左 / 右子树的深度差 1 时 则返回 -1 也可以是其他负值主要用来标明 此子树不是平衡树 方便后续剪枝 。
终止条件
当 cur 为空说明越过叶节点因此返回高度 0 当左右子树深度为 −1 代表此树的 左右子树 不是平衡树可行性剪枝直接返回 −1
isBalanced 函数实现判断
返回值 若 fun(root) ! -1 则说明此树平衡返回 true 否则返回 false 。
class Solution { // 后序遍历剪枝int fun(TreeNode* cur){if(!cur) return 0;int left fun(cur-left);if(left-1) return -1; // 剪枝int right fun(cur-right);if(right-1) return -1; // 剪枝return abs(left-right) 2 ? max(left, right) 1 : -1;}
public:bool isBalanced(TreeNode* root) {if(root nullptr) return true;;return fun(root)!-1;}
};