leetcode刷題筆記一百一十四題 二叉樹展開為連結串列
阿新 • • 發佈:2020-08-07
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 } } }