题目:
给你二叉树的根结点 root ,请你将它展开为一个单链表:
展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
展开后的单链表应该与二叉树 先序遍历 顺序相同。
思路:
(树的遍历) O(n)
从根节点遍历整颗树,对于当前节点:
1、如果存在左子树,则将左子树插入当前节点右边。
2、否则,遍历至右子树
图示过程如下:
C++:
#include<iostream>
using namespace std;
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode();
TreeNode(int x)
{
val = x;
left = right = nullptr;
}
TreeNode(int x,TreeNode *left,TreeNode *right)
{
val = x;
left = left;
right = right;
}
};
class Solution
{
public:
void flatten(TreeNode *root)
{
TreeNode* p = root->left;
if(p != nullptr)
{
// 找到根左节点分支的最右节点
while(p->right != nullptr)
{
p = p->right;
}
p->right = root->right;
root->right = root->left;
root->left = nullptr;
}
root = root->right;
}
};
Python:
解题思路:依次将每个节点的子节点进行操作。
class TreeNode:
def __init__(self,val = 0,left = None, right = None):
self.val = x
self.left = left
self.right = right
class Solution:
def flatten(self,root):
while root:
if root.left: # 左子树存在才进行操作
sub_left = root.left
while sub_left.right: # 左子树的右子树找到最深
sub_left = sub_left.right
# 将root的右子树挂到左子树的右子树的最深
sub_left.right = root.right
root.right = root.left # 将root的左子树挂到右子树
root.left = None # 清空左子树
root = root.right # 继续下一个节点