码迷,mamicode.com
首页 > 其他好文 > 详细

24.二叉搜索树与双向链表

时间:2016-05-13 01:51:52      阅读:142      评论:0      收藏:0      [点我收藏+]

标签:

二叉搜索树与双向链表

题目描述

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
// 25.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"


struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
class Solution {
public:
	TreeNode* Convert(TreeNode* pRoot)
	{
		if (pRoot == NULL) return NULL;

		TreeNode* ppLastNode = NULL;
		inOrder(pRoot, &ppLastNode);
		TreeNode* pRetHead = ppLastNode;
		while (pRetHead->left != NULL) {
			pRetHead = pRetHead->left;
		}
		return pRetHead;
	}

	void inOrder(TreeNode* pNode, TreeNode** ppLastNode) {
		if (pNode == NULL) return;

		if (pNode->left != NULL) {
			inOrder(pNode->left, ppLastNode);
		}

		// 关键代码
		pNode->left = *ppLastNode;
		if (*ppLastNode != NULL) {
			(*ppLastNode)->right = pNode;
		}
		*ppLastNode = pNode;

		if (pNode->right != NULL) {
			inOrder(pNode->right, ppLastNode);
		}
	}
};
int _tmain(int argc, _TCHAR* argv[])
{
	TreeNode root(10);

	TreeNode rootLeft(6);
	TreeNode rootRight(14);

	TreeNode rootLeftLeft(4);
	TreeNode rootLeftRight(8);

	TreeNode rootRightLeft(12);
	TreeNode rootRightRight(16);

	root.left = &rootLeft;
	root.right = &rootRight;
	rootLeft.left = &rootLeftLeft;
	rootLeft.right = &rootLeftRight;
	rootRight.left = &rootRightLeft;
	rootRight.right = &rootRightRight;
	Solution s;
	TreeNode* ret = s.Convert(&root);
	return 0;
}
根据二叉搜索树的特性,想要从小到大遍历二叉搜索树,需要实现中序遍历。如果想以实参的方式返回指针值,那么需要指向指针的指针。
inOrder函数的编写可分为两步:
1.搭建中序遍历框架:
	void inOrder(TreeNode* pNode, TreeNode** ppLastNode) {
		if (pNode == NULL) return;

		if (pNode->left != NULL) {
			inOrder(pNode->left, ppLastNode);
		}

		// 关键代码

		if (pNode->right != NULL) {
			inOrder(pNode->right, ppLastNode);
		}
	}
2.在关键代码处编写特定的程序:
	void inOrder(TreeNode* pNode, TreeNode** ppLastNode) {
		if (pNode == NULL) return;

		if (pNode->left != NULL) {
			inOrder(pNode->left, ppLastNode);
		}

		// 关键代码
		pNode->left = *ppLastNode;
		if (*ppLastNode != NULL) {
			(*ppLastNode)->right = pNode;
		}
		*ppLastNode = pNode;

		if (pNode->right != NULL) {
			inOrder(pNode->right, ppLastNode);
		}
	}




24.二叉搜索树与双向链表

标签:

原文地址:http://blog.csdn.net/chengonghao/article/details/51347266

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!