//思路:中序遍历访问结点的顺序就是二叉链表从前往后安置顺序
//两个指针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;
}
二叉树转化成双向链表
最新推荐文章于 2021-03-20 13:53:37 发布