转换一个二叉树为双列表

采用中序遍历,将左子树中根节点的前驱节点和右子树中根节点的后继节点与根节点连接。

  1 #include <iostream>
  2 
  3 using namespace std;
  4 
  5 template<class T>
  6 struct tree_node
  7 {
  8     T data;
  9     tree_node * left_child;
 10     tree_node * right_child;
 11 };
 12 
 13 /*************************************************
 14 Function:       // double_stack
 15 Description:    // 二叉树构建函数,采用递归方法
 16                    实现二叉树到双列表的转换。通过
 17                    中序遍历方法递归遍历整个树
 18 Input:          // root: 树根节点
 19 Return:         // 无
 20 *************************************************/
 21 template<class T>
 22 void recursion(tree_node<T> * root)
 23 {
 24     tree_node<T> *temp;
 25     if(root != NULL)
 26     {
 27         //遍历左子树,找到已经转换成列表的左子树列表中最右边的一个node
 28         //与root节点连接成为其左边节点
 29         recursion(root->left_child);
 30         temp = root->left_child;        
 31         if(temp != NULL)
 32         {
 33             while(temp->right_child != NULL)
 34             {
 35                 temp = temp->right_child;
 36             }
 37             temp->right_child = root;
 38             root->left_child = temp;
 39         }
 40 
 41         //遍历右子树,找到已经转换成列表的左子树列表中最左边的一个node
 42         //与root节点连接成为其左边节点
 43         recursion(root->right_child);
 44         temp = root->right_child;
 45         if(temp != NULL)
 46         {
 47             while (temp->left_child != NULL)
 48             {
 49                 temp = temp->left_child;
 50             }
 51             temp->left_child = root;
 52             root->right_child = temp;
 53         }
 54     }
 55 }
 56 
 57 /*************************************************
 58 Function:       // trans_algorithm
 59 Description:    // 封装递归调用函数
 60 Input:          // root 二叉树根节点
 61 Return:         // 无
 62 *************************************************/
 63 template<class T>
 64 void trans_algorithm(tree_node<T> *&root)
 65 {
 66     recursion(root);
 67     if(root != NULL)
 68     {
 69         while(root->left_child != NULL)
 70         {
 71             root = root->left_child;
 72         }
 73     }
 74 }
 75 
 76 /*************************************************
 77 Function:       // insert_node
 78 Description:    // 插入一个树节点到一棵树中
 79 Input:          // root:树的根节点
 80                 // data: 树节点值
 81 Return:         // 无
 82 *************************************************/
 83 template<class T>
 84 static void insert_node(tree_node<T> *root, T data)
 85 {
 86     tree_node<int> *new_node = new tree_node<int>;
 87     new_node->left_child = NULL;
 88     new_node->right_child = NULL;
 89     new_node->data = data;
 90     
 91     tree_node<int> *temp, *temp1;
 92     temp = root;
 93     while(temp != NULL)
 94     {
 95         temp1 = temp;
 96         if(temp->data > data)
 97         {                
 98             temp = temp->left_child;
 99         }
100         else
101         {
102             temp = temp->right_child;
103         }
104     }
105     if(temp1->data > data)
106     {
107         temp1->left_child = new_node;
108     }
109     else
110     {
111         temp1->right_child = new_node;
112     }
113 }
114 
115 void main()
116 {    
117     //构建一个排序二叉树
118     tree_node<int> *root = new tree_node<int>;
119     tree_node<int> *temp, *temp1;
120     root->left_child = NULL;
121     root->right_child = NULL;
122     root->data = 10;    
123     insert_node(root, 6);
124     insert_node(root, 4);
125     insert_node(root, 8);
126     insert_node(root, 3);
127     insert_node(root, 5);
128     insert_node(root, 7);
129     insert_node(root, 9);
130     insert_node(root, 2);
131     insert_node(root, 13);
132     insert_node(root, 12);
133     insert_node(root, 17);
134     insert_node(root, 14);
135     insert_node(root, 16);
136     insert_node(root, 15);
137     insert_node(root, 1);
138     insert_node(root, 20);
139     
140     //调用转换函数
141     trans_algorithm(root);
142     //删除节点及节点分配的内存空间
143     while(root != NULL)
144     {
145         cout << root->data << " ";
146         temp = root;
147         root = root->right_child;
148         delete temp;
149     }
150 }

 

转载于:https://www.cnblogs.com/liuxg/archive/2013/04/08/3007584.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值