面试题三十六:二叉搜索树与双向链表
输入一棵二叉搜索树,将该树转换成一个排序的双向链表,要求不能创建任何新的节点,只能调整树中的指针指向
分析:使用中序遍历每一个节点,根节点和左子树的右子树相连,根节点再和右子树的最左子树相连
BinaryTreeNode Convert( BinaryTreeNode pRootofTree ){ //指向双向链表的尾结点 BinaryTreeNode pLastNodeInList =null; ConvertNode( pRootofTree, pLastNodeInList); //返回头结点 BinaryTreeNode phead =pLastNodeInList; while( phead!=null phead.L!=null) phead=phead.L; return phead; } //通过不断更新尾结点的位置从而达到目的 //类似中序遍历,达到最左边设置为尾节点,再层层修改尾节点的位置 void ConvertNode( BinaryTreeNode pNode,BinaryTreeNode pLastNode){ if( pNode==null) return ; BinaryTreeNode pCurrent =pNode; //遍历到最左边的最小数,叶子 if(pCurrent .L!=null) ConvertNode( pCurrent .L , pLastNode); //使得左子树的右节点指向本节点,再把本节点设为尾结点 pCurrent .L= pLastNode; if( pLastNode!=null) pLastNode.R=pCurrent; pLastNode = pCurrent; //操作右子树 if(pCurrent .R!=null) ConvertNode( pCurrent .R , pLastNode); }
浪波激泥