平衡二叉树
什么是平衡二叉树?
一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。
递归法:
- 定义一个方法getHeight(TreeNode node)
- 当node为null时返回0
- 定义左子树节点方法和右子树节点方法
- 当左(右)子树节点getHeight()返回值为-1时,返回-1
- 当左子树节点返回值-右子树节点返回值的绝对值大于1时,返回-1
- 不属于以上情况时,返回两者最大值+1.
完整代码如下:
class Solution {
public boolean isBalanced(TreeNode root) {
return getHeight(root)!=-1;
}
private int getHeight(TreeNode node){
if(node==null){return 0;}
int leftHeight=getHeight(node.left);
if(leftHeight==-1){
return -1;
}
int rightHeight=getHeight(node.right);
if(rightHeight==-1){
return -1;
}
if(Math.abs(rightHeight-leftHeight)>1){
return -1;
}
return Math.max(leftHeight,rightHeight)+1;
}
}
二叉树的所有路径
注意事项:1.使用前序遍历,才方便让父节点指向孩子节点,找到对应的路径。
2.本题第一次涉及到回溯,因为我们要把路径记录下来,需要回溯来回退一个个路径,再进入到另一个路径。
过程如下图所示:
使用递归方法三步骤:
1.递归函数的函数参数以及返回值
void findallroutes(TreeNode node,List<Integer> path,List<String> result)
2.确定递归终止条件
找到叶子节点即结束处理逻辑
设定条件:
1.当node本身不为空,其余左右孩子都为空时,则找到叶子节点
2.for循环获取path记录的路径,for结束后加入记录的最后一个节点path.size()-1.
3. 把path转化为String类型(toString)加入到result中。
3.确定单层递归逻辑
判断递归的节点(左子树节点)是否为空,不为空则进行下一次递归。
注意进行回溯:path.remove(path.size()-1);
完整代码如下:
递归法:
class Solution {
/**
* 递归法
*/
public List<String> binaryTreePaths(TreeNode root) {
List<String> result =new ArrayList<>();
List<Integer> path =new ArrayList<>();
findallroutes(root,path,result);
return result;
}
private void findallroutes(TreeNode node,List<Integer> path,List<String> result){
path.add(node.val);
if(node.left==null&&node.right==null){
StringBuilder sb =new StringBuilder();
for(int i=0;i<path.size()-1;i++){
sb.append(path.get(i)).append("->");
}
sb.append(path.get(path.size()-1));
result.add(sb.toString());
}
if(node.left!=null){
findallroutes(node.left,path,result);
path.remove(path.size()-1);
}
if(node.right!=null){
findallroutes(node.right,path,result);
path.remove(path.size()-1);
}
}
}
本题也可用迭代法
使用前序遍历的迭代方式来模拟遍历路径的过程
需要一个栈来模拟递归和存放对应的遍历路径 Stack<Object> stack =new Stack<>
注意:因为需要节点本身来判断其左右子树节点是否为null,还有需要其节点值来打印路径。所以栈既要存放节点本身和结点的值。
完整代码如下:
class Solution {
/**
* 迭代法
*/
public List<String> binaryTreePaths(TreeNode root) {
List<String> result = new ArrayList<>();
if (root == null)
return result;
Stack<Object> stack = new Stack<>();
stack.push(root);
stack.push(root.val+"");
while(!stack.isEmpty()){
String path =(String) stack.pop();
TreeNode node =(TreeNode) stack.pop();
if(node.left==null&&node.right==null){
result.add(path);
}
if(node.left!=null){
stack.push(node.left);
stack.push(path+"->"+node.left.val);
}
if(node.right!=null){
stack.push(node.right);
stack.push(path+"->"+node.right.val);
}
}
return result;
}
}