给定一个二叉树,原地将它展开为链表。
例如,给定二叉树
1
/ \
2 5
/ \ \
3 4 6
将其展开为:
1
\
2
\
3
\
4
\
5
\
6
思路:
方法一:
class Solution {
public void flatten(TreeNode root) {
while(root!=null)
{
if(root.left==null)
root=root.right;
else
{
TreeNode pre=root.left;
while(pre.right!=null)
pre=pre.right;
pre.right=root.right;
root.right=root.left;
root.left=null;
root=root.right;
}
}
}
}
方法二:采用后序遍历的方式,我们知道后序遍历的方式是右子树->左子树->树根,因为我们可以每次走到当前的左节点,然后让该左节点的右节点成为我们之前已经构造好的列表,因为后序遍历已经更新完右子树,所以我们不担心右子树被覆盖。
class Solution {
public void flatten(TreeNode root) {
TreeNode pre=null;
Stack<TreeNode> st=new Stack<TreeNode>();
while(root!=null || !st.isEmpty())
{
while(root!=null)
{
st.push(root);
root=root.right;
}
root=st.peek();
if(root.left==null || root.left==pre)
{
st.pop();
root.right=pre;
root.left=null;
pre=root;
root=null;
}
else
root=root.left;
}
}
}
方法三:采用先序遍历的方式,只是我们需要将右子树提前用栈存起来。
class Solution {
public void flatten(TreeNode root) {
if(root==null)
return;
TreeNode pre=null;
Stack<TreeNode> st=new Stack<TreeNode>();
st.push(root);
while(!st.isEmpty())
{
TreeNode temp=st.pop();
if(pre!=null)
{
pre.right=temp;
pre.left=null;
}
if(temp.right!=null)
st.push(temp.right);
if(temp.left!=null)
st.push(temp.left);
pre=temp;
}
}
}