1.二元查找树转变成排序的双向链表

来源:互联网 发布:php 函数 变量='' 编辑:程序博客网 时间:2024/06/05 19:07
1.把二元查找树转变成排序的双向链表
题目:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
10
/ \
6 14
/ \ / \
4 8 12 16
转换成双向链表

4=6=8=10=12=14=16。


首先考虑:1.二叉树的结构;2.二叉查找树的构建;3.中序遍历;4.转变为双向链表(双向链表的前后结点可以借用二叉树的左右孩子,且仿照插入链表尾部细节,因是顺序的,故只在末尾插入)

#include<stdio.h>#include<stdlib.h>struct BSTreeNode{int data;BSTreeNode *left;BSTreeNode *right;};typedef BSTreeNode DoubleList;DoubleList *head=NULL;DoubleList *last=NULL;void addBSTreeNode(BSTreeNode *&pCurrent, int key)//必须要加引用,否则出不出来结果 //pCurrent由下面可知,地址发生了变化,而如果不加&的话,在被调函数过程中,地址发生变化而不会传回主调函数,只是主调函数指针指向的值可以发生变化 {if (pCurrent==NULL){BSTreeNode *pBSTree=(BSTreeNode*)malloc (sizeof(BSTreeNode));pBSTree->data=key;pBSTree->left=NULL;pBSTree->right=NULL;pCurrent=pBSTree;}else{if ((pCurrent->data) > key)addBSTreeNode(pCurrent->left,key);else if ((pCurrent->data) < key)addBSTreeNode(pCurrent->right,key);else printf("repeated\n");}}void convertToDoubleList(BSTreeNode *pCurrent)//因是顺序插入,故在链表的末尾插入 {pCurrent->left=last;if (last==NULL){head=pCurrent;}else{last->right=pCurrent;}last=pCurrent;printf("%d ",pCurrent->data);}void ergodicBSTree(BSTreeNode *pCurrent)//遍历二叉树 {if (pCurrent==NULL) {return;}if (pCurrent->left!=NULL){ergodicBSTree(pCurrent->left);}convertToDoubleList(pCurrent);if (pCurrent->right!=NULL){ergodicBSTree(pCurrent->right);}}int main(){    BSTreeNode *root=NULL;addBSTreeNode(root,10);addBSTreeNode(root,4);addBSTreeNode(root,6);    addBSTreeNode(root,8);addBSTreeNode(root,12);addBSTreeNode(root,14);addBSTreeNode(root,15);addBSTreeNode(root,16);ergodicBSTree(root);/*//或者从头输出 printf("\n");DoubleList *p=head;while(p<=last&&p!=NULL){printf("%d ",p->data);p=p->right;}*/system("pause");}


原创粉丝点击