您的位置:首页 > 其它

Flatten Binary Tree to Linked List

2016-06-06 15:06 357 查看
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

思路:题目要求将一个二叉树修改为一个单链表。用原来树的节点的right指针作为链表的指针来完成转换。

(1)对于一个节点p,如果其left指针不为NULL,首先保存下p的right指针

(2)将p的right指针指向p的left的部分

(3)找到原来的left部分子树的最右边的节点q,然后将q的right指针指向原来p的right指针

(4)修改p的left指针域为NULL,这个时候节点p处理完了

(5)接下来处理p的右子树的根节点,p=p->right,直到p为NULL

代码如下:

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

或者使用stack的方式如下:

class Solution {
public:
void flatten(TreeNode* root) {
if(!root)
return;
stack<TreeNode*>stk;
TreeNode* dummy=new TreeNode(0);
TreeNode*res=dummy;
stk.push(root);
while(!stk.empty()) //
{
TreeNode*top=stk.top();
res->right=top;
stk.pop();
if(top->right)
stk.push(top->right);
if(top->left)
stk.push(top->left);
top->left=NULL;
res=top;
}
root=dummy->right;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: