public IList<IList<int>> LevelOrder(TreeNode root)
 {
     if (root == null)
         return null;
     List<IList<int>> level = new List<IList<int>>();
     Queue<TreeNode> q = new Queue<TreeNode>();
     q.Enqueue(root);
     int length = q.Count;
     while (length != 0)
     {
         List<int> list = new List<int>();
         for (int i = 1; i <= length; i++)
         {
             TreeNode node = q.Dequeue();
             list.Add(node.val);
             if (node.left != null)
                 q.Enqueue(node.left);
             if (node.right != null)
                 q.Enqueue(node.right);
         }
         if (list.Count != 0)
             level.Add(list);
         length = q.Count;
     }
     return level;
 }
Пример #2
0
 public bool IsSameTree(TreeNode p, TreeNode q)
 {
     if (p == null && q == null)
         return true;
     else if (p == null || q == null)
         return false;
     return (p.val == q.val) && IsSameTree(p.left, q.left) && IsSameTree(p.right,q.right);
 }
Пример #3
0
 private bool help(TreeNode node1, TreeNode node2)
 {
     if (node1 == null && node2 == null)
         return true;
     if (node1 == null || node2 == null)
         return false;
     return (node1.val == node2.val) && (help(node1.left, node2.right)) && (help(node1.right, node2.left));
 }
Пример #4
0
 //LeetCode 104:https://leetcode.com/problems/maximum-depth-of-binary-tree/
 public int MaxDepth(TreeNode root)
 {
     if (root == null)
         return 0;
     int left = MaxDepth(root.left);
     int right = MaxDepth(root.right);
     return Math.Max(left,right)+1;
 }
Пример #5
0
 //可以看懂里面的逻辑,但是不是很理解为什么这样写,先放这里
 public bool Inorder(TreeNode node)
 {
     if (node == null)
         return true;
     if (!Inorder(node.left)) return false;
     if (pre != null && node.val <= pre.val) return false;
     pre = node;
     return Inorder(node.right);
 }
Пример #6
0
 public static void Main11()
 {
     TreeNode node1 = new TreeNode(2);
     TreeNode node2 = new TreeNode(1);
     TreeNode node3 = new TreeNode(3);
     node1.left = node2;
     node1.right = node3;
     Convert(node1);
     Console.ReadLine();
 }
 private TreeNode help(int[] nums, int begin, int end)
 {
     if (begin < end)
         return null;
     int mid = (begin + end) / 2;
     TreeNode node = new TreeNode(nums[mid]);
     node.right = help(nums, mid + 1, end);
     node.left = help(nums, begin, mid - 1);
     return node;
 }
 //模拟中序遍历构造二叉树
 private TreeNode help(int begin,int end)
 {
     if (begin > end)//这里的判断很重要,跟数组很像
         return null;
     int mid = (begin + end) / 2;
     TreeNode left=help(begin,mid-1);//按照中序遍历的顺序先构造左子树
     TreeNode node = new TreeNode(current.val);
     node.left = left;
     current = current.next;
     node.right = help(mid + 1, end);//再构造右子树
     return node;
 }
Пример #9
0
        private TreeNode Make(int[] preorder, int[] inorder, int prebegin, int preend, int inbegin, int inend)
        {
            //递归结束条件
            if (prebegin > preend)
                return null;

            int i = inbegin;
            while (preorder[prebegin] != inorder[i])
                i++;
            TreeNode node = new TreeNode(inorder[i]);
            node.left = Make(preorder, inorder, prebegin + 1, prebegin + i - inbegin, inbegin, i - 1);
            node.right = Make(preorder, inorder, prebegin + i - inbegin + 1, preend, i + 1, inend);
            return node;
        }
Пример #10
0
        private static TreeNode last = null; //代表链表最后一个节点

        #endregion Fields

        #region Methods

        public static void Convert(TreeNode node)
        {
            if (node == null)
                return;
            if (node.left != null)
                Convert(node.left);
            //链表指向下一个节点使用left,指向上一个节点是用right
            node.left = last;
            if (last != null)
                last.right = node;
            last = node;
            if (node.right != null)
                Convert(node.right);
        }
Пример #11
0
        //相似的一道题,将一颗二叉树转成它的镜像,剑指offer面试题19题
        public void MirrorRecursively(TreeNode head)
        {
            if (head == null)
                return;
            if (head.left == null && head.right == null)
                return;

            TreeNode temp = head.right;

            head.left = head.right;
            head.right = temp;

            if (head.left != null)
                MirrorRecursively(head.left);
            if (head.right != null)
                MirrorRecursively(head.right);
        }
Пример #12
0
        private int RootValue(TreeNode root, ref int Max)
        {
            if (root == null)
                return 0;
            int rootmax = root.val;
            int left = RootValue(root.left, ref Max);
            int right = RootValue(root.right, ref Max);
            //求出以root为节点的最大值
            rootmax = Math.Max(rootmax, root.val + left);
            rootmax = Math.Max(rootmax, root.val + right);

            //为什么不对!!!我知道了,root父亲的最大值不可能出现这种情况root.val + right + left,多画点图就明白了
            Max = Math.Max(Math.Max(rootmax,Max), root.val + right + left);

            //求到现在这个root节点为止的最大值
            //Max = Math.Max(rootmax, Max);
            return rootmax;
        }
 public void Flatten(TreeNode root)
 {
     if (root == null)
         return;
     if (last != null)
     {
         last.left = null;
         last.right = root;
     }
     last = root;
     TreeNode left = root.left;
     TreeNode right = root.right;
     if (left != null)
     {
         Flatten(left);
     }
     if (right != null)
     {
         Flatten(right);
     }
 }
Пример #14
0
 public int MaxPathSum(TreeNode root)
 {
     int Max = root.val;
     RootValue(root, ref Max);
     return Max;
 }
Пример #15
0
 public bool IsValidBST(TreeNode root)
 {
     if (root == null)
         return true;
     return Inorder(root);
 }
Пример #16
0
 public bool IsSymmetric(TreeNode root)
 {
     if (root == null)
         return false;
     return help(root.left, root.right);
 }