二叉树的一些算法<未完>

简介:

求二叉树中距离最远的2个节点的距离

本文中二叉树结构定义为:

1
2
3
4
5
6
本文中二叉树结构定义为:
struct  Node {
  Node* left;
  Node* right;
  int  data;
};

定义:空二叉树的高度为-1,只有根节点的二叉树高度为0,根节点在0层,深度为0。

两个节点的距离为两个节点间最短路径的长度。

求两节点的最远距离,实际就是求二叉树的直径。假设相距最远的两个节点分别为A、B,它们的最近共同父节点(允许一个节点是其自身的父节点)为C,则A到B的距离 = A到C的距离 + B到C的距离

节点A、B分别在C的左右子树下(假设节点C的左右两子树均包括节点C),不妨假设A在C的左子树上,由假设“A到B的距离最大”,先固定B点不动(即B到C的距离不变),根据上面的公式,可得A到C的距离最大,即点A是C左子树下距离C最远的点,即:

A到C的距离 = C的左子树的高度

同理,   B到C的距离 = C的右子树的高度

   因此,本问题可以转化为:“二叉树每个节点的左右子树高度和的最大值”。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
static  int  tree_height( const  Node* root,  int & max_distance)
{
  const  int  left_height = root->left ? tree_height(root->left,  max_distance) + 1 : 0;
  const  int  right_height = root->right ? tree_height(root->right, max_distance)  + 1 : 0;
  const  int  distance = left_height + right_height;
  if  (max_distance < distance) max_distance = distance;
  return  (left_height > right_height ? left_height : right_height);
}
  
int  tree_diameter( const  Node* root)
{
  int  max_distance = 0;
  if  (root) tree_height(root, max_distance);
  return  max_distance;
}

  

判断二叉树是否平衡二叉树

根据平衡二叉树的定义:每个结点的左右子树的高度差小等于1,只须在计算二叉树高度时,同时判断左右子树的高度差即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
static  int  tree_height( const  Node* root,  bool & balanced)
{
  const  int  left_height = root->left ? tree_height(root->left, balanced) + 1 : 0;
  if  (!balanced)  return  0;
  
  const  int  right_height = root->right ? tree_height(root->right, balanced) + 1 : 0;
  if  (!balanced)  return  0;
  
  const  int  diff = left_height - right_height;
  if  (diff < -1 || diff > 1) balanced =  false ;
  return  (left_height > right_height ? left_height : right_height);
}
  
bool  is_balanced_tree( const  Node* root)
{
  bool  balanced =  true ;
  if  (root) tree_height(root, balanced);
  return  balanced;
}

  

 

目录
相关文章
|
7月前
|
存储 C语言 C++
问题 D: DS查找—二叉树平衡因子(不一样的新做法哦)
问题 D: DS查找—二叉树平衡因子(不一样的新做法哦)
|
4月前
|
Java
如何实现一个高效的二叉搜索树(BST)?请给出时间复杂度分析。 要求:设计一个二叉搜索树,支持插入、删除和查找操作。要求在平均情况下,这些操作的时间复杂度为O(log n)。同时,考虑树的平衡性,使得树的高度保持在对数级别。
如何实现一个高效的二叉搜索树(BST)?请给出时间复杂度分析。 要求:设计一个二叉搜索树,支持插入、删除和查找操作。要求在平均情况下,这些操作的时间复杂度为O(log n)。同时,考虑树的平衡性,使得树的高度保持在对数级别。
34 0
|
9月前
力扣203移除链表元素:思路分析+代码实现+方法总结(伪头节点法&递归)
力扣203移除链表元素:思路分析+代码实现+方法总结(伪头节点法&递归)
48 0
|
5月前
|
算法
代码随想录算法训练营第十八天 | 力扣 513. 找树左下角的值、112. 路径总和、113. 路径总和 II、106. 从中序与后序遍历序列构造二叉树、105. 从前序与中序遍历序列构造二叉树
代码随想录算法训练营第十八天 | 力扣 513. 找树左下角的值、112. 路径总和、113. 路径总和 II、106. 从中序与后序遍历序列构造二叉树、105. 从前序与中序遍历序列构造二叉树
32 0
|
8月前
|
存储 算法
算法训练Day18|● 513.找树左下角的值● 112. 路径总和 113.路径总和ii● 106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树
算法训练Day18|● 513.找树左下角的值● 112. 路径总和 113.路径总和ii● 106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构造二叉树
|
8月前
|
算法
算法训练Day22|235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点
算法训练Day22|235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点
|
8月前
|
存储 算法
算法训练Day17|● 104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
算法训练Day17|● 104.二叉树的最大深度 559.n叉树的最大深度● 111.二叉树的最小深度● 222.完全二叉树的节点个数
|
10月前
|
算法
【算法真题 一】满二叉搜索树求三个节点的最低公共祖先
【算法真题 一】满二叉搜索树求三个节点的最低公共祖先
61 0
|
算法 Java
根据二叉树已知的节点信息,构建二叉树的算法
根据二叉树已知的节点信息,构建二叉树的算法
|
算法 Java
【算法】字符串复原IP地址,从前序与中序编辑序列构造二叉树 三道算法题
字符串复原IP地址,从前序与中序编辑序列构造二叉树
89 1
【算法】字符串复原IP地址,从前序与中序编辑序列构造二叉树 三道算法题