191110题

在这里插入图片描述
在这里插入图片描述
由于pTailOfList指针是全局更新的,所以使用二重指针做函数形参。

#include<iostream>
using namespace std;
struct TreeNode {
	int value;
	TreeNode*left;
	TreeNode*right;
	TreeNode(int x = 0) :value(x), left(NULL), right(NULL) {}
};
class Solution {
public:
	TreeNode*Convert(TreeNode*proot) {
		if (proot == NULL)
			return NULL;

		TreeNode*pTailOfList = NULL;//双向链表的尾结点初始化
		//开始转换结点
		ConvertCore(proot, &pTailOfList);

		//完成转换后寻找链表的头结点
		TreeNode*pHeadOfList = pTailOfList;
		while (pHeadOfList != NULL&&pHeadOfList->left != NULL)
			pHeadOfList = pHeadOfList->left;
		return pHeadOfList;
	}

private:
	//中序遍历
	void ConvertCore(TreeNode*pnode, TreeNode**pTailOfList) {
		TreeNode*pcurrent = pnode;//每个子递归都要记录当前结点
		//递归左子树
		if (pcurrent->left != NULL)
			ConvertCore(pcurrent->left, pTailOfList);

		//开始双向连接
		pcurrent->left = *pTailOfList;
		if (*pTailOfList != NULL)
			(*pTailOfList)->right = pcurrent;
		//更新双向链表的尾结点
		*pTailOfList = pcurrent;

		//递归右子树
		if (pcurrent->right != NULL)
			ConvertCore(pcurrent->right, pTailOfList);
	}
};
int main(void) {
	TreeNode*root = new TreeNode(10);
	TreeNode*node1 = new TreeNode(6); TreeNode*node2 = new TreeNode(14);
	TreeNode*node3 = new TreeNode(4); TreeNode*node4 = new TreeNode(8); TreeNode*node5 = new TreeNode(12); TreeNode*node6 = new TreeNode(16);
	root->left = node1; root->right = node2;
	node1->left = node3; node1->right = node4;
	node2->left = node5; node2->right = node6;

	Solution solution;
	TreeNode*head = solution.Convert(root);
	TreeNode*temp = head;
	cout << "从左往右打印链表" << endl;
	while (temp != NULL)
	{
		cout << temp->value << " ";
		temp = temp->right;
	}
	cout << endl;

	cout << "从右往左打印链表" << endl;
	temp = head;
	while (temp->right != NULL)
		temp = temp->right;
	while (temp != NULL)
	{
		cout << temp->value << " ";
		temp = temp->left;
	}
	cout << endl;
	system("pause");
	return 0;
}


在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值