Flatten Binary Tree to Linked List

描述:

  给定一个二叉树,原地将它展开为链表。

解答:

  观察给定二叉树转换为链表的形式和前序遍历是相同的。因此考虑使用前序遍历的迭代算法,

前序遍历的迭代算法使用了一个辅助栈,栈中存放当前访问节点的右子树。先从左边依次向下访

问,然后在访问最下方节点的右子树,因此使用栈结构来实现访问。

  以上所提到的为前序遍历的迭代算法,本题的主要思想也为前序遍历,但和直接前序遍历有所

区别。代码如下:

  

 1 class Solution {
 2 public:
 3     void flatten(TreeNode* root) {
 4         if (!root) return;
 5         stack<TreeNode*> s;
 6         s.push(root);
 7         while (!s.empty()) {
 8             TreeNode *t = s.top(); s.pop();
 9             if (t->left) {//当前带访问的节点
10                 TreeNode *r = t->left;//左边节点存在
11                 while (r->right) r = r->right;
12                 r->right = t->right;//最后一个被访问的左子树节点指向第一个被访问的右子树节点
13                 t->right = t->left;//当前节点的右子树变为左节点
14                 t->left = NULL;
15             }
16             if (t->right) s.push(t->right);//结束完当前节点的操作后
17         }
18     }
19 };
View Code

  在该代码当中,访问当前的节点时要注意将其转换为链表,当前节点左子树存在的话找到其中最右

侧节点,将其的右子树变为当前节点的右子树节点。然后将当前节点左右子树互换,左子树置为空。若

右子树不为空,则右子树的根节点为下一个待访问的节点。

 

posted @ 2019-11-29 21:03  一只小菜鸡a  阅读(103)  评论(0)    收藏  举报