欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Leetcode中二叉树简单题目题目总结

程序员文章站 2022-06-17 19:49:54
...

其实我最近找了个工作,过的有多废物就先不说了。
这里总结一下二叉树的知识。
二叉树镜像:
请完成一个函数,输入一个二叉树,该函数输出它的镜像。
Leetcode中二叉树简单题目题目总结
做这一题建议先刷完二叉树深度的题目,为啥, 因为深度的题目简单,当然这题也简单是leetcode上简单的题目,不过我有多菜就先不说了。刷完深度的题目,对二叉树递归差不多就有点感觉了。

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     public int val;
 *     public TreeNode left;
 *     public TreeNode right;
 *     public TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public TreeNode MirrorTree(TreeNode root) {
        if(root==null) return null;
        MirrorSingle(root);
       MirrorTree(root.left);
        MirrorTree(root.right);
        return root;
    }
    private void MirrorSingle(TreeNode node)
    {
       TreeNode t = node.left;
       node.left = node.right;
       node.right =t;
    }
}

其实这套框架和二叉树中序遍历,或者某某深度是差不多的,都是先找单个例子,完成单个结点的左右替换,然后在进行左右子树的替换。
然后刷完所有的遍历。我递归做得,对不起我就是这么垃圾。
最难的是层次遍历。
对不起我还是只会递归。
Leetcode中二叉树简单题目题目总结

public class Solution {
        public IList<IList<int>> LevelOrder(TreeNode root)
        {
            IList<IList<int>> res = new List<IList<int>>();
            if (root == null) return res;
            LeverOrder(root, res, 0);
            return res;
        }
        private void LeverOrder(TreeNode root,IList<IList<int>> res,int depth)
        {
            if (root == null) return;
            if(res.Count<=depth)
            {
                res.Add(new List<int>());
            }
            res[depth].Add(root.val);
            LeverOrder(root.left, res, depth + 1);
            LeverOrder(root.right, res, depth + 1);
        }
}

Leetcode中二叉树简单题目题目总结
中序遍历,是顺序的依次来求解。

public class Solution {
        int count = 0;
        int curVal = -100;
        int max = -1;
        public int[] FindMode(TreeNode root)
        {
            List<int> lst = new List<int>();
            dfs(root, lst);
            return lst.ToArray();
        }
        private void dfs(TreeNode root,List<int> lst)
        {
            if (root == null) return;
            if(root.left!=null)
            dfs(root.left,lst);
           if(root.val!=curVal)
            {
                count = 1;
                curVal = root.val;
               if(count>max)
                {
                    if(lst.Contains(root.val)==false)
                    {
                        lst.Clear();
                        lst.Add(root.val);
                    }
         
                    max = count;
                }
                else if(count==max)
                {
                    if(lst.Contains(root.val)==false)
                        lst.Add(root.val);
                }
            }
            else
            {
                ++count;
                if(count>max)
                {
                      lst.Clear();
                        lst.Add(root.val);
         
                    max = count;
                }
                else if(count==max)
                {
                    if(lst.Contains(root.val)==false)
                        lst.Add(root.val);
                }
            }
            if(root.right!=null)
                dfs(root.right,lst);
        }
}

Leetcode中二叉树简单题目题目总结

public class Solution {
        public bool IsSymmetric(TreeNode root)
        {
            if(root==null) return true;
            return isSymmetric(root.left,root.right);
        }
        private bool isSymmetric(TreeNode r1,TreeNode r2)
        {
            if(r1!=null&&r2!=null)
            {
                return 
                        r1.val==r2.val
                        &&
                        isSymmetric(r1.left,r2.right)
                        &&
                        isSymmetric(r2.left,r1.right);
            }
            else if(r1==null&&r2==null) return true;
            else return false;
        }
}

Leetcode中二叉树简单题目题目总结
一种比较经典的DFS搜索算法,大概就是传个值进去找到直接赋值返回就行了。

    public TreeNode SearchBST(TreeNode root, int val) {
        if(root==null) return null;
        TreeNode dummy=null;
        dfs(root,val,ref dummy);
        return dummy;
    }
    private void dfs(TreeNode root,int val,ref TreeNode dummy)
    {
        if(root==null) return;
        if(dummy==null&&root.val==val){
            dummy = root;
            return;
        }
        if(dummy==null)
        {
          dfs(root.left,val,ref dummy);
          dfs(root.right,val,ref dummy);
        }
    }

Leetcode中二叉树简单题目题目总结
居然也能也能有100%的题目。
Leetcode中二叉树简单题目题目总结

    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        if(root==null) return null;
        if(p==null||q==null) return null;
        if(p.val<root.val&&q.val>root.val) 
        {
            return root;
        }
        else if(p.val>root.val&&q.val<root.val)
        {
            return root;
        }
        else if(p==root)
        {
            return p;
        }
        else if(q==root)
        {
            return q;
        }
        else if(p.val<root.val&&q.val<root.val)
        {
            return lowestCommonAncestor(root.left,p,q);
        }
        else if(p.val>root.val&&q.val>root.val)
        {
            return lowestCommonAncestor(root.right,p,q);
        }
        return null;
    }

记录一种工作中用的dfs。

public Transform FindChildNode(Transform parent,string nodeName){
	//先序遍历
	var node = parent.Find(nodeName);
	if(node!=null) return node;
	//遍历parent的每一个孩子
	foreach(var tran in parent){
		node = FindChildNode(tran,nodeName);
		if(node!=null)
		{
			return node;
		}
	}
	return null;
}
相关标签: 算法