美文网首页
Swift.重建二叉树

Swift.重建二叉树

作者: cubegao | 来源:发表于2019-02-03 16:49 被阅读0次

    题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入的前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建出下图所示的二叉树并输出它的头结点。

    image.png
    class Solution {
        func rebuildTree(_ preOrder: [Int],_ inOrder: [Int]) -> TreeNode? {
            var p = preOrder
            var i = inOrder
            return recursive(&p, 0, p.count-1, &i, 0, i.count-1)
        }
       
        //不改变原输入
        func recursive(_ preOrder: inout [Int],_ startPre: Int,_ endPre: Int,_ inOrder: inout [Int],_ startIn: Int,_ endIn: Int) -> TreeNode? {
            if startPre > endPre || startIn > endIn {
                return nil
            }
            var root  = TreeNode(preOrder[startPre])
            for index in startIn...endIn {
                if inOrder[index] == root.val {
                    root.left = recursive(&preOrder, startPre+1, startPre+(index-startIn), &inOrder, startIn, index-1))
                    root.right = recursive(&preOrder, startPre+(index-startIn)+1, &inOrder, index+1, endIn)
                     break
                }
            }
            return root
        }
    
         //改变原输入,难度低一点
        func recursive(_ preOrder: inout [Int],_ inOrder: inout [Int],_ startIn: Int,_ endIn: Int) -> TreeNode? {
            if  startIn > endIn {
                return nil
            }
            var root  = TreeNode(preOrder.removeFirst())
            for index in startIn...endIn {
                if inOrder[index] == root.val {
                    root.left = recursive(&preOrder, &inOrder, startIn, index-1))
                    root.right = recursive(&preOrder, &inOrder, index+1, endIn)
                     break
                }
            }
            return root
        }
    }
    

    相关文章

      网友评论

          本文标题:Swift.重建二叉树

          本文链接:https://www.haomeiwen.com/subject/jjiysqtx.html