博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【Flatten Binary Tree to Linked List】cpp
阅读量:7095 次
发布时间:2019-06-28

本文共 2754 字,大约阅读时间需要 9 分钟。

题目:

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

代码:

/** * 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) {            if (!root) return;            stack
sta; TreeNode *dummy = new TreeNode(INT_MIN); TreeNode *pre = dummy; dummy->right = root; sta.push(root); while ( !sta.empty() ) { TreeNode *tmp = sta.top(); sta.pop(); if ( tmp->right ) sta.push(tmp->right); if ( tmp->left ) sta.push(tmp->left); tmp->left = NULL; pre->right = tmp; pre = tmp; } }};

tips:

先序遍历(node->left->right);每次出栈的元素都切断left(为什么right不用切?因为在下一次迭代的时候,pre->right自然就把right的值覆盖了)。

设立一个pre节点,保存上一次出栈的元素。

pre->right = tmp就能按照题意把原有的tree给flatten了。

===================================

学习了一个递归版的代码

/** * 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) {        // terminal condition        if (!root) return;        // recersive left and child        flatten(root->left);        flatten(root->right);        // if left is not null then do the reconnection        if (!root->left) return;        TreeNode *p = root->left;        while ( p->right) p = p->right;        p->right = root->right;        root->right = root->left;        root->left = NULL;    }};

===================================================

第二次过这道题,使用非递归版做的,一开始忘记了给left方向断开,改了一次之后AC了。

/** * 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) {            stack
sta; TreeNode* pre = new TreeNode(0); if ( root ) sta.push(root); while ( !sta.empty() ) { TreeNode* tmp = sta.top(); sta.pop(); pre->right = tmp; pre->left = NULL; if ( tmp->right ) sta.push(tmp->right); if ( tmp->left ) sta.push(tmp->left); pre = tmp; } }};

 

转载于:https://www.cnblogs.com/xbf9xbf/p/4505174.html

你可能感兴趣的文章
设计流程及工具记录
查看>>
关于CDialogBar的编程
查看>>
吹きすさぶ风の中で
查看>>
对象引用前加const 报错
查看>>
linux 0.11 源码学习(十一)
查看>>
编码风格——linux内核开发的coding style
查看>>
表格隔行变色案例
查看>>
IOS 模拟不同网络环境 - Network Link Conditioner
查看>>
JAVA第一周学习
查看>>
sql语句select group by order by where一般先后顺序 转载
查看>>
for循环是怎么工作的
查看>>
支付宝支付
查看>>
第三周 动态规划算法(1):1.集合加法
查看>>
iPhone 上怎么给CSS定义 active 样式
查看>>
讨论CGContextDrawImage
查看>>
Servlet基础
查看>>
tomcat+mysql安装配置,项目部署(上)
查看>>
linux sysrq
查看>>
Incorrect NSStringEncoding value 0x0000 detected.
查看>>
(转)as3数组的深复制和浅复制
查看>>