二叉树转化成双向链表

//思路:中序遍历访问结点的顺序就是二叉链表从前往后安置顺序
//两个指针head指向链表头,curr指向当前已经正确安放的链表节点
//即head和curr中间的部分已经访问并且成为双向链表
//一直访问,一直更新curr指向节点的lchild和rchild指针
#include<iostream>
using namespace std;

typedef struct int_BT_Node{
	int value;
	struct int_BT_Node *lchild;
	struct int_BT_Node *rchild;
} int_BT_Node , *int_BT_Pointer;

//全局遍历
int_BT_Pointer head;//指向链表的第一个结点
int_BT_Pointer curr;//指向当前结点

void add_Node( int_BT_Pointer & T , const int v ) {
	if( T == NULL ) {
		T = ( int_BT_Pointer ) malloc( sizeof( int_BT_Node ) );
		T -> lchild = NULL;
		T -> rchild = NULL;
		T -> value = v;
	}
	else if( T -> value > v ) {
		add_Node( T -> lchild , v );
	}
	else{
		add_Node( T -> rchild , v );
	}
}

void conv( int_BT_Pointer & T ) {
	//第一个访问的节点一定是最左节点,这时候对head赋值 
	if( head == NULL ) {
		head = T;
	}
	if( T != NULL ) {
		T -> lchild = curr;
		//当访问最左结点的时候curr还是空的
		if( curr != NULL ) {
			curr -> rchild = T;
		}
		//队列中curr左边的节点都是二叉树中已经访问过的节点
		curr = T;
	}
}

void inorder_conv( int_BT_Pointer T ) {
	if( T != NULL ) {
		inorder_conv( T -> lchild );
		conv( T );
		inorder_conv( T -> rchild );
	}
}

void main() {
	//记得加NULL
	int_BT_Pointer root = NULL;
	//添加一些结点
	add_Node( root , 10 );
	add_Node( root , 6 );
	add_Node( root , 14 );
	add_Node( root , 4 );
	add_Node( root , 8 );
	add_Node( root , 12 );
	add_Node( root , 16 );
	
	//指空
	head = curr = NULL;

	//中序遍历中修改指针
	inorder_conv( root );

	int_BT_Pointer tail = NULL;

	while( head != NULL ) {
		tail = head;
		cout << head -> value <<" ";
		head = head -> rchild;
	}
	cout << endl;
	head = tail;
	while( tail != NULL ) {
		cout << tail -> value << " ";
		tail = tail -> lchild;
		free( head );
		head = tail;
	}
	cout << endl;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值