面试题27:二叉搜索树转换为有序双向链表
2015-06-01 17:47
519 查看
题目:输入一棵二叉搜索树,现在要将该二叉搜索树转换成一个排序的双向链表。而且在转换的过程中,不能创建任何新的结点,只能调整树中的结点指针的指向来实现。
思路:设置一个指针,用来指向链表的尾结点,初始化为NULL,中序遍历二叉树,先遍历左子树,找到第一个结点,它的左结点为空,将这个结点的左结点指针指向链表的尾结点,将链表尾结点的右指针指向当前结点,修改尾结点指针让它继续指向尾结点,然后判断它的右结点。
思路:设置一个指针,用来指向链表的尾结点,初始化为NULL,中序遍历二叉树,先遍历左子树,找到第一个结点,它的左结点为空,将这个结点的左结点指针指向链表的尾结点,将链表尾结点的右指针指向当前结点,修改尾结点指针让它继续指向尾结点,然后判断它的右结点。
#include <iostream> using namespace std; struct BinaryTreeNode { int m_nValue; BinaryTreeNode * m_pLeft; BinaryTreeNode * m_pRight; }; BinaryTreeNode * Convert(BinaryTreeNode * pRoot) { //链表的尾指针 BinaryTreeNode * pLastNodeOfList=NULL; ConvertNode(pRoot,&pLastNodeOfList); //寻找头结点 BinaryTreeNode * pHead=pLastNodeOfList; while(pHead!=NULL&&pHead->m_pLeft!=NULL) { pHead=pHead->m_pLeft; } return pHead; } void ConvertNode(BinaryTreeNode * pNode,BinaryTreeNode * * pLastNodeOfList) { if(pNode==NULL) return; BinaryTreeNode * pCurrentNode=pNode;//当前结点 //遍历左子树 if(pCurrentNode->m_pLeft!=NULL) { ConvertNode(pCurrentNode->m_pLeft,pLastNodeOfList); } //将当前结点的左结点指向链表的尾结点 pCurrentNode->m_pLeft=*pLastNodeOfList; //如果链表尾结点不为空,将尾结点的右指针指向当前结点 if(*pLastNodeOfList!=NULL) { (*pLastNodeOfList)->m_pRight=pCurrentNode; } //将当前结点设为尾结点 *pLastNodeOfList=pCurrentNode; //遍历右子树 if(pCurrentNode->m_pRight!=NULL) { ConvertNode(pCurrentNode->m_pRight,pLastNodeOfList); } }
相关文章推荐
- 黑马程序员——Java基础—String类
- 黑马程序员——Java基础—线程间通信
- iOS面试题
- 面试题26:复杂链表的赋值
- Java经典面试题
- 黑马程序员——IO流(二)
- 黑马程序员——IO流(一)
- 面试技巧
- 黑马程序员——集合框架
- 黑马程序员——JAVA概述
- 黑马程序员--Java基础学习03
- 黑马程序员——Map集合
- 黑马程序员——Java反射
- 黑马程序员-java之TreeSet,Comparable,Comparator
- 黑马程序员——String类和基本数据类型包装类
- 黑马程序员——单例设计模式
- 黑马程序员-框架技术实现的手段-反射基础
- 面试宝典
- 黑马程序员——Set集合+hashCode+比较器
- 黎活明给程序员的忠告(转)