题目:二叉搜索树与双向链表
题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
解题思路:
分解这种二叉树的题目,肯定是要运行递归的思想,递归去分块拆解。我们每次的拆解不应该影响后续为拆解节点的left和right,那么只能把节点从下向上去拆解。
我们举一个例子,下面这样的节点我们就可以按照这样的拆解顺序来:先拆解右节点,然后左节点,最终根节点(类似后序遍历)
5
3 7
1 4 6 8
2
代码如下:
package com.solution;
import com.solution.model.TreeNode;
/**
* 二叉搜索树与双向链表
* 5
* 3 7
* 1 4 6 8
* 2
* ->
* 1345678 的双向链表
* 1为头节点,指向3,3的左右节点分为指向1,4
*/
public class Solution {
public static void main(String[] args) {
Solution solution = new Solution();
TreeNode node5 = new TreeNode(5);
TreeNode node3 = new TreeNode(3);
TreeNode node7 = new TreeNode(7);
TreeNode node1 = new TreeNode(1);
TreeNode node4 = new TreeNode(4);
TreeNode node6 = new TreeNode(6);
TreeNode node8 = new TreeNode(8);
TreeNode node2 = new TreeNode(2);
node5.left = node3;
node5.right = node7;
node3.left = node1;
node3.right = node4;
node1.right = node2;
node7.left = node6;
node7.right = node8;
TreeNode convert = solution.Convert(node5);
System.out.println(convert);
}
TreeNode header;
public TreeNode Convert(TreeNode pRootOfTree) {
if (pRootOfTree == null) {
return null;
}
operateNode(pRootOfTree, pRootOfTree.left, pRootOfTree.right);
return header;
}
public void operateNode(TreeNode parentNode, TreeNode leftNode, TreeNode rightNode) {
if (rightNode != null) {
operateNode(rightNode, rightNode.left, rightNode.right);
if (rightNode.left == null) {
rightNode.left = parentNode;
} else {
rightNode.left.left = parentNode;
parentNode.right = rightNode.left;
}
}
if (leftNode == null) {
header = parentNode;
return;
}
operateNode(leftNode, leftNode.left, leftNode.right);
if (leftNode.right == null) {
leftNode.right = parentNode;
} else {
leftNode.right.right = parentNode;
parentNode.left = leftNode.right;
}
}
}