Leecode热题100---114:二叉树展开为链表

题目
给你二叉树的根结点 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			# 继续下一个节点
				
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ghx3110

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值