二叉搜索树与双向链表

xiaoxiao2021-02-28  47

题目描述:

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。

问题分析:

在二叉树中,每个节点都有两个指向子节点的指针;同样,在双向链表中,每个节点也有两个指针。这两种数据结构相似,是有可能实现二叉搜索树与双向链表的转化的。

在搜索二叉树中,左子节点总是小于父节点的,右子节点总是大于父节点的,因此在转换的时候,原先指向左子节点的指针调整为链表中指向前一个节点的指针,原先指向右子节点的指针调整为链表中指向后一个节点指针。所以,我们就有了解题思路。

把根节点与左右子树分开,找到左子树最大的节点pleft,pleft.right指向根节点root,root.left指向pleft;找到右子树最小的节点pright,pright.left指向root,root.right指向pright;然后左子树与右子树的处理方法与上面一样,对其进行递归。

参考代码如下:

/** public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } */ public class TreeNodeConvertList { public TreeNode Convert(TreeNode pRootOfTree) { if(pRootOfTree==null) return null; pRootOfTree=ConvertTreeNode(pRootOfTree); while( pRootOfTree.left!=null) pRootOfTree=pRootOfTree.left; return pRootOfTree; } public TreeNode ConvertTreeNode(TreeNode root){ if(root==null) return null; if(root.left!=null){ TreeNode left=ConvertTreeNode(root.left); //找到左子树中最大的节点,然后与root根节点连接 while(left.right!=null) left=left.right; left.right=root; root.left=left; } if(root.right!=null){ TreeNode right=ConvertTreeNode(root.right); //找到右子树中最小的节点,然后与root根节点连接 while(right.left!=null) right=right.left; right.left=root; root.right=right; } return root; } }

转载请注明原文地址: https://www.6miu.com/read-56940.html

最新回复(0)