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 };
在该代码当中,访问当前的节点时要注意将其转换为链表,当前节点左子树存在的话找到其中最右
侧节点,将其的右子树变为当前节点的右子树节点。然后将当前节点左右子树互换,左子树置为空。若
右子树不为空,则右子树的根节点为下一个待访问的节点。

浙公网安备 33010602011771号