二叉树展开为链表

题目

如题

分析

一.递归
其实仔细观察例子是一个先序遍历。先遍历到左子树最后一个节点,然后将左子树放到右子树位置,同时左子树置null
将原来右子树放到左子树的的最右节点。然后一层一层往上重复,到了根节点就完成了。
二.非递归
非递归其实是从上往下展开。将从根节点开始判断,如果根节点的左子树不为空,则将左子树移到右子树的位置,同
时根节点的左子树置null。然后将右子树放到左子树的右节点,然后再判断当前节点的左子树,重复上述操作。

解法1:递归

	void flatten(TreeNode* root) {
		if (root == nullptr){
			return;
		}

		if (root->left){
			flatten(root->left);
		}
		if (root->right){
			flatten(root->right);
		}

		TreeNode* tmp = root->right;
		root->right = root->left;
		root->left = nullptr;
		while (root->right){
			root = root->right;
		}
		root->right = tmp;
	}

解法2:非递归

void flatten1(TreeNode* root) {
		while (root)
		{
			if (root->left)
			{
				TreeNode* tmp = root->right;
				root->right = root->left;
				root->left = nullptr;
				TreeNode* curNode = root->right;
				while (curNode->right){
					curNode = curNode->right;
				}
				curNode->right = tmp;
			}
			
			root = root->right;
		}
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值