c/c++语言开发共享C++实现LeetCode(114.将二叉树展开成链表)

[leetcode] 114. flatten binary tree to linked list 将二叉树展开成链表given a binary tree, flatten it to a lin


[leetcode] 114. 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

hints:

if you notice carefully in the flattened tree, each node’s right child points to the next node of a pre-order trave

这道题要求把二叉树展开成链表,根据展开后形成的链表的顺序分析出是使用先序遍历,那么只要是数的遍历就有递归和非递归的两种方法来求解,这里我们也用两种方法来求解。首先来看递归版本的,思路是先利用 dfs 的思路找到最左子节点,然后回到其父节点,把其父节点和右子节点断开,将原左子结点连上父节点的右子节点上,然后再把原右子节点连到新右子节点的右子节点上,然后再回到上一父节点做相同操作。代码如下:

解法一:

  class solution {  public:      void flatten(treenode *root) {          if (!root) return;          if (root->left) flatten(root->left);          if (root->right) flatten(root->right);          treenode *tmp = root->right;          root->right = root->left;          root->left = null;          while (root->right) root = root->right;          root->right = tmp;      }  };

例如,对于下面的二叉树,上述算法的变换的过程如下:

       1      /      2   5    /       3   4   6         1      /      2   5                3   6                     4       1             2                 3                     4                         5                             6

下面再来看非迭代版本的实现,这个方法是从根节点开始出发,先检测其左子结点是否存在,如存在则将根节点和其右子节点断开,将左子结点及其后面所有结构一起连到原右子节点的位置,把原右子节点连到元左子结点最后面的右子节点之后。代码如下:

解法二:

  class solution {  public:      void flatten(treenode *root) {          treenode *cur = root;          while (cur) {              if (cur->left) {                  treenode *p = cur->left;                  while (p->right) p = p->right;                  p->right = cur->right;                  cur->right = cur->left;                  cur->left = null;              }              cur = cur->right;          }      }  };

例如,对于下面的二叉树,上述算法的变换的过程如下:

       1      /      2   5    /       3   4   6       1             2      /      3   4                     5                         6                  1             2                 3                     4                         5                             6

前序迭代解法如下:

解法三:

  class solution {  public:      void flatten(treenode* root) {          if (!root) return;          stack<treenode*> s;          s.push(root);          while (!s.empty()) {              treenode *t = s.top(); s.pop();              if (t->left) {                  treenode *r = t->left;                  while (r->right) r = r->right;                  r->right = t->right;                  t->right = t->left;                  t->left = null;              }              if (t->right) s.push(t->right);          }      }  };

此题还可以延伸到用中序,后序,层序的遍历顺序来展开原二叉树,分别又有其对应的递归和非递归的方法,有兴趣的童鞋可以自行实现。

github 同步地址:

类似题目:

flatten a multilevel doubly linked list

参考资料:

到此这篇关于c++实现leetcode(114.将二叉树展开成链表)的文章就介绍到这了,更多相关c++实现将二叉树展开成链表内容请搜索<计算机技术网(www.ctvol.com)!!>以前的文章或继续浏览下面的相关文章希望大家以后多多支持<计算机技术网(www.ctvol.com)!!>!

需要了解更多c/c++开发分享C++实现LeetCode(114.将二叉树展开成链表),都可以关注C/C++技术分享栏目—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/c-cdevelopment/676271.html

(0)
上一篇 2021年7月23日
下一篇 2021年7月23日

精彩推荐