1. 程式人生 > 實用技巧 >leetcode刷題筆記一百一十四題 二叉樹展開為連結串列

leetcode刷題筆記一百一十四題 二叉樹展開為連結串列

leetcode刷題筆記一百一十四題 二叉樹展開為連結串列

源地址:114. 二叉樹展開為連結串列

問題描述:

給定一個二叉樹,原地將它展開為一個單鏈表。

例如,給定二叉樹

1

/
2 5
/ \
3 4 6
將其展開為:

1

2

3

4

5

6

/**
本題方法可以使用先序遍歷方式,具體可分為遞迴和迭代
另一種方法可以使用先驅結點
*/
//遞迴方法 -- 先序遍歷 將先序遍歷結果放入res,然後修改左右結點
/**
 * Definition for a binary tree node.
 * class TreeNode(_value: Int = 0, _left: TreeNode = null, _right: TreeNode = null) {
 *   var value: Int = _value
 *   var left: TreeNode = _left
 *   var right: TreeNode = _right
 * }
 */
import scala.collection.mutable 
object Solution {
  def flatten(root: TreeNode): Unit = {
      var res = new mutable.ListBuffer[TreeNode]()
      preOrderTraversal(root)
      for (i <- 1 to res.size - 1){
          val prev = res(i-1)
          val cur = res(i)
          prev.left = null
          prev.right = cur
      }


      def preOrderTraversal(root: TreeNode): Unit = {
          if (root != null){
              res += root
              preOrderTraversal(root.left)
              preOrderTraversal(root.right)
          }
      }
  }
}

//與遞迴方法思想一致,使用stack實現迭代方法
/**
 * Definition for a binary tree node.
 * class TreeNode(_value: Int = 0, _left: TreeNode = null, _right: TreeNode = null) {
 *   var value: Int = _value
 *   var left: TreeNode = _left
 *   var right: TreeNode = _right
 * }
 */
import scala.collection.mutable 
object Solution {
  def flatten(root: TreeNode): Unit = {
        if (root == null) return
        val stack = new mutable.Stack[TreeNode]()
        stack.push(root)
        var prev: TreeNode = null
        while (stack.isEmpty == false){
            val cur = stack.pop
            if (prev != null){
                prev.left = null
                prev.right = cur
            } 
            
            val left = cur.left
            val right = cur.right

            if (right != null) stack.push(right)
            if (left  != null)  stack.push(left)
            prev = cur
        }
  }
}

//對pre cur next結點調整先序結點位置,本質還是按照先序遍歷改變樹的結構
/**
 * Definition for a binary tree node.
 * class TreeNode(_value: Int = 0, _left: TreeNode = null, _right: TreeNode = null) {
 *   var value: Int = _value
 *   var left: TreeNode = _left
 *   var right: TreeNode = _right
 * }
 */
import scala.collection.mutable 
object Solution {
  def flatten(root: TreeNode): Unit = {
    var cur = root
    while (cur != null){
        if (cur.left != null){
            var next = cur.left
            var predecessor = next
            while (predecessor.right != null) predecessor = predecessor.right
            predecessor.right = cur.right
            cur.left = null
            cur.right = next
        }
        cur = cur.right
    }
  }
}