題目
給定乙個二叉樹,原地將它展開為乙個單鏈表。
遞迴前序遍歷記錄節點,然後重新展成單鏈表。
/**
* definition for a binary tree node.
* public class treenode
* treenode(int val)
* treenode(int val, treenode left, treenode right)
* }*/class
solution
}void
preorder
(treenode root,list
listnode)
listnode.
add(root)
;preorder
(root.left,listnode)
;preorder
(root.right,listnode);}
}
迭代前序遍歷節點。
/**
* definition for a binary tree node.
* public class treenode
* treenode(int val)
* treenode(int val, treenode left, treenode right)
* }*/class
solution
node=stack.
pop();
node=node.right;
}int size=list.
size()
;for
(int i=
1;i}
使用棧遍歷,可以有左右子樹的先後痕跡,因此可以直接在遍歷中同步鏈結。
/**
* definition for a binary tree node.
* public class treenode
* treenode(int val)
* treenode(int val, treenode left, treenode right)
* }*/class
solution
if(cur.right!=null)
if(cur.left!=null)
pre=cur;}}
}
題目中要求原地展開,感覺主要是要這個方法:即不通過棧,而是o(1)的空間複雜度來完成。
這也是最快的方法。
/**
* definition for a binary tree node.
* public class treenode
* treenode(int val)
* treenode(int val, treenode left, treenode right)
* }*/class
solution
pre.right=cur.right;
cur.left=null;
cur.right=next;
} cur=cur.right;}}
}
114 二叉樹展開為鍊錶
首先是原地演算法的定義 演算法原地工作的含義是指不需要任何額外的輔助,演算法所需要的輔助空間不隨著問題的規模而變化,是乙個確定的值。通過觀察示例可以知道,我們可以猜想,大方向是前序遍歷。第一種思路 dfs。設定乙個全域性的指標 這種做法有點脫離原地演算法,因為多開闢了乙個指標變數 核心思想是拿到乙個...
114 二叉樹展開為鍊錶
一開始寫的 114 二叉樹展開為鍊錶 definition for a binary tree node.class treenode def init self,x self.val x self.left none self.right none class solution def flatt...
114 二叉樹展開為鍊錶
給定乙個二叉樹,原地將它展開為鍊錶。例如,給定二叉樹 1 2 5 3 4 6將其展開為 1 2 3 4 5 6思路 從題目可以看出來要求先根遍歷。從根節點開始出發,先檢測其左子結點是否存在 1 找到左子結點最後面的右子節點 如果沒有,就是左子節點本身 2 將根節點和其右子節點斷開,把原右子節點連到原...