算法训练营 day17 二叉树 平衡二叉树 二叉树的所以路径 左叶子之和
平衡二叉树
110. 平衡二叉树 - 力扣(LeetCode)
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
递归法
- 明确递归函数的参数和返回值
参数:当前传入节点。
返回值:以当前传入节点为根节点的树的高度。
- 明确终止条件
递归的过程中依然是遇到空节点了为终止,返回0,表示当前节点为根节点的树高度为0.
- 明确单层递归的逻辑
如何判断以当前传入节点为根节点的二叉树是否是平衡二叉树呢?当然是其左子树高度和其右子树高度的差值。
分别求出其左右子树的高度,然后如果差值小于等于1,则返回当前二叉树的高度,否则返回-1,表示已经不是二叉平衡树了。
class Solution {
public boolean isBalanced(TreeNode root) {
return getHeight(root)!=-1;
}
private static int getHeight(TreeNode root) {
if (root==null) return 0;
int leftHeight = getHeight(root.left);
if (leftHeight==-1) return -1;
int rightHeight = getHeight(root.right);
if (rightHeight==-1) return -1;
int result;
if (Math.abs(leftHeight-rightHeight)>1) result=-1;
else result = Math.max(rightHeight,leftHeight)+1;
return result;
}
}
迭代法
class Solution {
public boolean isBalanced(TreeNode root) {
if (root==null) return true;
Stack<TreeNode> st = new Stack<>();
TreeNode node;
st.push(root);
while (!st.isEmpty()){
node = st.pop();
if (Math.abs(getHeight(node.left)-getHeight(node.right))>1)return false;
if (node.left!=null)st.push(node.left);
if (node.right!=null)st.push(node.right);
}
return true;
}
private static int getHeight(TreeNode root) {
if (root==null) return 0;
Stack<TreeNode> st = new Stack<>();
TreeNode node;
st.push(root);
int depth = 0;
int result = 0;
while (!st.isEmpty()){
node = st.pop();
if (node!=null){
st.push(node);
st.push(null);
depth++;
if (node.left!=null)st.push(node.left);
if (node.right!=null)st.push(node.right);
}else {
st.pop();
depth--;
}
result = result>depth? result : depth;
}
return result;
}
}
二叉树的所以路径
257. 二叉树的所有路径 - 力扣(LeetCode)
给你一个二叉树的根节点 root
,按 任意顺序 ,返回所有从根节点到叶子节点的路径。
叶子节点 是指没有子节点的节点。
递归法
- 递归函数函数参数以及返回值
要传入根节点,记录每一条路径的path,和存放结果集的result,这里递归不需要返回值.
- 确定递归终止条件
当 cur不为空,其左右孩子都为空的时候,就找到叶子节点。
- 确定单层递归逻辑
因为是前序遍历,需要先处理中间节点,中间节点就是我们要记录路径上的节点,先放进path中。
class Solution {
public List<String> binaryTreePaths(TreeNode root) {
List<String> result = new ArrayList<>();
if (root==null){
return result;
}
List<Integer> path = new ArrayList<>();
traversal(root,path,result);
return result;
}
private static void traversal(TreeNode root, List<Integer> paths, List<String> res) {
paths.add(root.val);
if (root.left==null&&root.right==null){
StringBuilder sb = new StringBuilder();
for (int i = 0; i < paths.size()-1; i++) {
sb.append(paths.get(i)).append("->");
}
sb.append(paths.get(paths.size()-1));
res.add(sb.toString());
}
if (root.left!=null){
traversal(root.left,paths,res);
paths.remove(paths.size()-1);
}
if (root.right!=null){
traversal(root.right,paths,res);
paths.remove(paths.size()-1);
}
}
}
迭代法
class Solution {
public List<String> binaryTreePaths(TreeNode root) {
List<String> result = new ArrayList<>();
if (root==null) return result;
Stack<TreeNode> st = new Stack<>();
Stack<String> paths = new Stack<>();
st.push(root);
paths.push(String.valueOf(root.val));
while (!st.isEmpty()){
TreeNode node = st.pop();
String path = paths.pop();
if (node.left==null&&node.right==null){
result.add(path);
}
if (node.left!=null){
st.push(node.left);
paths.push(path+"->"+String.valueOf(node.left.val));
}
if (node.right!=null){
st.push(node.right);
paths.push(path+"->"+String.valueOf(node.right.val));
}
}
return result;
}
}
左叶子之和
404. 左叶子之和 - 力扣(LeetCode)
给定二叉树的根节点 root
,返回所有左叶子之和
递归法
- 确定递归函数的参数和返回值
判断一个树的左叶子节点之和,那么一定要传入树的根节点,递归函数的返回值为数值之和,所以为int
使用题目中给出的函数就可以了。
- 确定终止条件
如果遍历到空节点,那么左叶子值一定是0,注意,只有当前遍历的节点是父节点,才能判断其子节点是不是左叶子。 所以如果当前遍历的节点是叶子节点,那其左叶子也必定是0
- 确定单层递归的逻辑
当遇到左叶子节点的时候,记录数值,然后通过递归求取左子树左叶子之和,和 右子树左叶子之和,相加便是整个树的左叶子之和。
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
if (root==null) return 0;
if (root.left==null&&root.right==null) return 0;
int leftheight = sumOfLeftLeaves(root.left);
if (root.left!=null&&root.left.left==null&&root.left.right==null){
leftheight = root.left.val;
}
int rightheight = sumOfLeftLeaves(root.right);
int sum = leftheight+rightheight;
return sum;
}
}
迭代法
class Solution {
public int sumOfLeftLeaves(TreeNode root) {
if (root==null) return 0;
int sum = 0;
Stack<TreeNode> st = new Stack<>();
TreeNode node;
st.push(root);
while (!st.isEmpty()){
node = st.pop();
if (node.left != null && node.left.left == null && node.left.right == null) {
sum += node.left.val;
}
if (node.left!=null) st.push(node.left);
if (node.right!=null) st.push(node.right);
}
return sum;
}