学习网址:http://blog.csdn.net/v_july_v/article/details/5934051
把二元查找树转变成排序的双向链表:
输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。
要求不能创建任何新的结点,只调整指针的指向。
转换成双向链表
4=6=8=10=12=14=16。
首先我们定义的二元查找树 节点的数据结构如下:
struct BSTreeNode { int m_nValue; // value of node BSTreeNode *m_pLeft; // left child of node BSTreeNode *m_pRight; // right child of node };
1.首先了解什么是二元查找树以及其特性。
2.存储二元查找树的存储结构
3.中序遍历二元查找树,会得到期望的由小到大的顺序。
4.调整左右指针,将其分别指向前面元素和后面元素。第一个元素的左元素为null,最后一个元素的右元素为null。
解完。
百度或google一下就知道:
二元查找树: 它首先要是一棵二元树,在这基础上它或者是一棵空树;或者是具有下列性质的二元树: (1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值; (2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值; (3)左、右子树也分别为二元查找树
存储结构采用数组的形式:第一个位置存储根节点,左右节点的形式为2i+1,2i+2。
int[] bsTree = {10,6,14,4,8,12,16};
中序遍历:中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。在遍历左、右子树时,仍然先遍历左子树,再访问根结点,最后遍历右子树。
中序遍历后得到的数组为{4,6,8,10,12,14,16}
调整指针
(java实现)
public class BSTreeNode { int value; // value of node BSTreeNode left; // left child of node BSTreeNode right; // right child of node public int getValue() { return value; } public void setValue(int value) { this.value = value; } public BSTreeNode getLeft() { return left; } public void setLeft(BSTreeNode left) { this.left = left; } public BSTreeNode getRight() { return right; } public void setRight(BSTreeNode right) { this.right = right; } @Override public String toString() { return "BSTreeNode [value=" + value + "]"; } }
public class Problem1 { static BSTreeNode[] sortedNode; int index = 0; // 由输入的值的数组得到根节点 private BSTreeNode step2(int[] bsTree, int begin) { int lIndex = 2 * begin + 1; int rIndex = 2 * begin + 2; int length = bsTree.length; BSTreeNode rootNode = new BSTreeNode(); rootNode.setValue(bsTree[begin]); if (lIndex < length) { rootNode.setLeft(step2(bsTree, lIndex)); } if (rIndex < length) { rootNode.setRight(step2(bsTree, rIndex)); } return rootNode; } // 中序排序 void step3(BSTreeNode rootNode) { if (rootNode == null) return; step3(rootNode.left); sortedNode[index++] = rootNode; step3(rootNode.right); } // 指针变换 void step4() { for (int i = 0; i < sortedNode.length; i++) { BSTreeNode node = sortedNode[i]; node.setLeft(i - 1 > 0 ? sortedNode[i - 1] : null); node.setRight(i + 1 < sortedNode.length ? sortedNode[i + 1] : null); } BSTreeNode firstNode = sortedNode[0]; System.out.println("--"); } public static void main(String[] args) { Problem1 p1 = new Problem1(); // step2 int[] bsTree = { 10, 6, 14, 4, 8, 12, 16 }; sortedNode = new BSTreeNode[bsTree.length]; BSTreeNode rootNode = p1.step2(bsTree, 0); p1.step3(rootNode); for (int i = 0; i < sortedNode.length; i++) { System.out.println("第" + i + "节点的值为" + sortedNode[i]); } p1.step4(); System.out.println("Done"); } }
输出
第0节点的值为BSTreeNode [value=4] 第1节点的值为BSTreeNode [value=6] 第2节点的值为BSTreeNode [value=8] 第3节点的值为BSTreeNode [value=10] 第4节点的值为BSTreeNode [value=12] 第5节点的值为BSTreeNode [value=14] 第6节点的值为BSTreeNode [value=16] -- Done