LeetCode OJ:Flatten Binary Tree to Linked List

来源:互联网 发布:安信车辆软件 编辑:程序博客网 时间:2024/06/11 12:27

Flatten Binary Tree to Linked List

 

Given a binary tree, flatten it to a linked list in-place.

For example,
Given

         1        / \       2   5      / \   \     3   4   6

The flattened tree should look like:
   1    \     2      \       3        \         4          \           5            \             6

click to show hints.

Hints:

If you notice carefully in the flattened tree, each node's right child points to the next node of a pre-order traversal.

算法思想:

假设dfs(root->left)表示的是左子树是一颗单调向下的树,当前节点要做的事就是,将这颗左子树添加到当前节点与当前节点右节点之间。

例如如题所示,对于2节点,就是将3加入到2和4之间,对于1,就是将2-3-4这颗单调向下树加入到1和5之间,一次类推

/** * Definition for binary tree * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    void flatten(TreeNode *root) {        if(root ==NULL)return;                flatten(root->left);        flatten(root->right);                if(root->left==NULL)return;                TreeNode *p=root->left;        while(p->right)p=p->right;        p->right=root->right;        root->right=root->left;        root->left=NULL;    }};

递归版2

/** * Definition for binary tree * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    void flatten(TreeNode *root) {        flatten(root,NULL);    }private:    TreeNode *flatten(TreeNode *root,TreeNode *tail){        if(NULL == root)return tail;                root->right=flatten(root->left,flatten(root->right,tail));        root->left=NULL;        return root;    }};

迭代版

/** * Definition for binary tree * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:    void flatten(TreeNode *root) {        if(NULL==root)return;                stack<TreeNode *>s;        s.push(root);        while(!s.empty()){            auto p=s.top();            s.pop();                        if(p->right)                s.push(p->right);            if(p->left)                s.push(p->left);                        p->left=NULL;            if(!s.empty())                p->right=s.top();        }    }};




0 0
原创粉丝点击