代码随想录算法训练营第十七天|110.平衡二叉树、257.二叉树的所有路径、404.左叶子之和

110.平衡二叉树

递归法:

public class Solution {
    public bool IsBalanced(TreeNode root) {
        return GetHeight(root)==-1?false:true;
    }
    public int GetHeight(TreeNode root)
    {
        if(root==null)
        {
            return 0;
        }
        int left=GetHeight(root.left);
        if(left==-1)
        {
            return -1;
        }
        int right=GetHeight(root.right);
        if(right==-1)
        {
            return -1;
        }
        int ans=0;
        if(Math.Abs(left-right)>1)
        {
            ans=-1;
        }else
        {
            ans=1+Math.Max(left,right);
        }
        return ans;
    }
}

申明一个GetHeight()函数用于判断是否为二叉平衡树并且实现递归,如果传入的节点为空则返回0,如果有左右节点就去判断是否为-1也就是说左右子树的差的绝对值是否大于1,如果不是则返回1加上左右子树较大的那个值作为以该节点为根的一个高度,处理完成后再主函数里判断是否返回值为-1,如果是则说明非平衡树,不为-1则是二叉平衡树。

257.二叉树的所有路径

public class Solution {
    public IList<string> BinaryTreePaths(TreeNode root) {
        var path=new List<int>();
        var res=new List<string>();
        if(root==null)
        {
            return res;
        }
        Traversal(root,path,res);
        return res;
    }
    public void Traversal(TreeNode node,List<int> path,List<string> res)
    {
        path.Add(node.val);
        if(node.left==null&&node.right==null)
        {
            string s="";
        for(int i=0;i<path.Count-1;i++)
        {
            s+=path[i].ToString();
            s+="->";
        }
        s+=path[path.Count-1].ToString();
        res.Add(s);
        return;
        }
        if(node.left!=null)
    {
        Traversal(node.left,path,res);
        path.RemoveAt(path.Count-1);
    }
    if(node.right!=null)
    {
        Traversal(node.right,path,res);
        path.RemoveAt(path.Count-1);
    }
    }
    
}

写一个Traversal()函数用于回溯和记录,终止条件则是叶子结点,即左节点为空,右节点也为空,之前用了一个Path来记录每一个节点的值,现在就遍历Path长度然后每个元素之间加上箭头分割,然后将这一条路径放入Res里面,如果不是叶子结点则将左右节点放入Traversal函数继续递归,然后在路径里删除最后一项相当于指针进行一个回溯操作。

404.左叶子之和

public class Solution {
    public int SumOfLeftLeaves(TreeNode root) {
        if(root==null)
        {
            return 0;
        }
        int l=SumOfLeftLeaves(root.left);
        if(root.left!=null&&root.left.left==null&&root.left.right==null)
        {
            l+=root.left.val;
        }
        int r=SumOfLeftLeaves(root.right);
        return l+r;
    }
}

排除根节点为空的情况,于是递归根的左节点,左节点不不为空,左左节点不为空,左右节点不为空,那就说明当前节点是左叶子节点,然后加上它的值即可,同理也去根节点的右节点去找,同样找这个位置(左叶子节点)然后左子树的左叶子总和加上右子树左叶子总和返回即可。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值