采用中序遍历,将左子树中根节点的前驱节点和右子树中根节点的后继节点与根节点连接。
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