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