Problem: 114. 二叉树展开为链表


文章目录

  • 题目
  • 思路
  • 解题方法
  • Code


题目

给你二叉树的根结点 root ,请你将它展开为一个单链表:

  • 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
  • 展开后的单链表应该与二叉树 先序遍历 顺序相同。

思路

按照先序遍历的顺序,将每个结点压入到栈里面.开始出栈,记录前驱,让新出栈的结点右孩子指向前驱, 左孩子指向null ;

解题方法

  1. dfs 按照先序遍历顺序将节点压入栈 treeStack中。
  2. 出栈,将出栈元素的右孩子指向前驱,左孩子指向null ;
  3. 更新前驱结点。

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); 
        }     


    }
};