Problem: 114. 二叉树展开为链表
文章目录
- 题目
- 思路
- 解题方法
- Code
题目
给你二叉树的根结点 root ,请你将它展开为一个单链表:
- 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
- 展开后的单链表应该与二叉树 先序遍历 顺序相同。
思路
按照先序遍历的顺序,将每个结点压入到栈里面.开始出栈,记录前驱,让新出栈的结点右孩子指向前驱, 左孩子指向null ;
解题方法
- dfs 按照先序遍历顺序将节点压入栈
treeStack
中。- 出栈,将出栈元素的右孩子指向前驱,左孩子指向null ;
- 更新前驱结点。
Code
class Solution {
public:
stack<TreeNode*> treeStack ;
void flatten(TreeNode* root) {
dfs(root) ;
TreeNode * pre = NULL ;
while(!treeStack.empty()){
TreeNode* t = treeStack.top() ;
treeStack.pop( ) ;
t->right = pre ;
t->left = NULL ;
pre = t ;
}
// return root ;
}
void dfs(TreeNode* root) {
if(!root ) {
return ;
}
treeStack.push(root) ;
if(root->left ) {
dfs(root->left) ;
}
if(root->right ){
dfs(root->right);
}
}
};