給定一個二叉樹,原地將它展開爲鏈表。
例如,給定二叉樹
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;
}
}
}