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
代码如下:
或者使用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;
}
};
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;
}
};
相关文章推荐
- 数据库操作集合
- iOS RTMP 视频直播开发笔记(3) --- 与帧相关的概念
- Android 手机抓包方法(一)
- Linux下Mysql安装多实例 & 主从配置
- Python学习笔记 —— 数字类型【Numbers】及常用方法
- 第十五周程序阅读-范型程序设计(5)
- linux挂载磁盘及磁盘格式化
- C#中的ASCII转换
- 这应该是迄今为止最全的一份Java就业指导书
- 截取整个ScrollerView视图
- oracle imp (表导不出)
- java内存模型
- Python装饰器与面向切面编程
- git and github 学习笔记
- [转]SpringMVC工作原理
- Convert.ToInt32(Object, IFormatProvider)的含义
- iOS 屏幕方向
- ★【16.6.2】Codeforces Round #355 (Div. 2) A. Vanya and Fence
- 盲打
- Merge Sorted Array(easy)