二叉搜索树转换为双向链表

<span style="font-size:18px;">二叉搜索树转换成对应的双向链表,不能生成新的节点,只允许改变节点的的指针。</span>
<span style="font-size:18px;">解题思路:</span>
<span style="font-size:18px;">由于按照中序遍历方法遍历二叉搜索树得到的结果是有序的,因此可以按照中序遍历方法遍历搜索树。定义函数BinaryTreeNode* Transfer(BinaryTreeNode* root),该函数将以节点root为根节点的二叉树转换为对应的有序双向链表,并返回该双向链表的头节点指针。具体代码如下:<img src="https://img-blog.csdn.net/20160831215418737?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /><img src="https://img-blog.csdn.net/20160831215418737?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /></span>
// ConsoleApplication7.cpp : 定义控制台应用程序的入口点。
//二叉搜索树转双向链表

#include "stdafx.h"
#include<iostream>
#include<string>
using namespace std;
struct BinaryTreeNode{
	int mvalue;
	struct BinaryTreeNode *p_left;
	struct BinaryTreeNode *p_right;
	
};
void printTree(BinaryTreeNode *root);
void InsertNode(BinaryTreeNode **root,BinaryTreeNode *node){
	//cout << root;
	if (*root==NULL){
		*root = node;
	}
	else{
		BinaryTreeNode *q,*p=NULL;
		q = *root;
		while (q){
			if (q->mvalue < node->mvalue){
				p = q;
				q = q->p_right;

			}
			else{
				p = q;
				q = q->p_left;
			}

		}
		if (p->mvalue > node->mvalue){
			p->p_left = node;
		}
		else if(p->mvalue<node->mvalue){
			p->p_right = node;
		}

	}
};
BinaryTreeNode* Transfer(BinaryTreeNode* root){
	BinaryTreeNode *p, *q,*r,*m,*n;
	p = root->p_left;
	q = root->p_right;
	if (root){
		if (!p && !q){
			return root;
		}
		r = Transfer(p);
		m = r;
		while (m->p_right){
			m = m->p_right;
		}
		root->p_left = m;
		m->p_right = root;
		n = Transfer(q);
		root->p_right = n;
		n->p_left = root;
		//m = Transfer(q);
		return r;
	}
	

}
//函数传入二级指针
void CreateBinarySearchTree(int *a,int n, BinaryTreeNode** root){
	for (int i = 0; i < n; i++){
		BinaryTreeNode* newnode = new BinaryTreeNode;
		newnode->mvalue = a[i];
		newnode->p_left = NULL;
		newnode->p_right = NULL;
		InsertNode(root,newnode);
		//printTree(*root);
		//cout << endl;
	}


}
void printTree(BinaryTreeNode *root){
	if (root){
		printTree(root->p_left);
		cout <<root->mvalue << endl;
		printTree(root->p_right);
	}
}
int _tmain(int argc, _TCHAR* argv[])
{
	int a[7] = { 10, 14, 6, 12, 16, 4, 8 };
	BinaryTreeNode **root = (BinaryTreeNode**)malloc(sizeof(BinaryTreeNode*));
	*root = NULL;
	BinaryTreeNode* phead,*q;
	CreateBinarySearchTree(a, 7, root);
	phead = Transfer(*root);
	//printTree(*root);
	for (BinaryTreeNode *p = phead; p;q=p, p = p->p_right)
	{
		cout << p->mvalue << endl;
	}
	for (BinaryTreeNode *p = q; p; p = p->p_left)
	{
		cout << p->mvalue << endl;
	}
	//cout << q->mvalue << endl;
	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值