package test;
/**
*
题目:输入一颗二元查找树,将该树转换为它的镜像,
即在转换后的二元查找树中,左子树的结点都大于右子树的结点。
用递归和循环两种方法完成树的镜像转换。
例如输入:
8
/ \
6 10
/ \ / \
<span style="white-space:pre"> </span>5 7 9 11
输出:
<span style="white-space:pre"> </span> 8
/ \
10 6
/ \ / \
<span style="white-space:pre"> </span>11 9 7 5
思路:前序遍历二元查找树,
有子树,则交换指针指向。
*/
public class MS_15 {
/**
* 翻转树
* @param root
*/
private void reverseTree(BSTreeNode root) {
System.out.println();
printTree(node1);
if(root != null) {
BSTreeNode t = root.m_pLeft;
root.m_pLeft = root.m_pRight;
root.m_pRight = t;
if(root.m_pLeft!=null) {
reverseTree(root.m_pLeft);
}
if(root.m_pRight!=null) {
reverseTree(root.m_pRight);
}
}
}
//初始化二叉树
static MS_15 ms15 = new MS_15();
static BSTreeNode node1 = ms15.new BSTreeNode();
static BSTreeNode node2 = ms15.new BSTreeNode();
static BSTreeNode node3 = ms15.new BSTreeNode();
static BSTreeNode node4 = ms15.new BSTreeNode();
static BSTreeNode node5 = ms15.new BSTreeNode();
static BSTreeNode node6 = ms15.new BSTreeNode();
static BSTreeNode node7 = ms15.new BSTreeNode();
//赋值
static{
node1.m_nValue=8;
node1.m_pLeft=node2;
node1.m_pRight=node3;
node2.m_nValue = 6;
node2.m_pLeft=node4;
node2.m_pRight=node5;
node3.m_nValue = 10;
node3.m_pLeft = node6;
node3.m_pRight = node7;
node4.m_nValue = 5;
node4.m_pLeft = null;
node4.m_pRight = null;
node5.m_nValue = 7;
node5.m_pLeft = null;
node5.m_pRight = null;
node6.m_nValue = 9;
node6.m_pLeft = null;
node6.m_pRight = null;
node7.m_nValue = 11;
node7.m_pLeft = null;
node7.m_pRight = null;
}
/**
* 打印树
* @param root
*/
private static void printTree(BSTreeNode root) {
if(root!=null) {
System.out.print(root.m_nValue+",");
if(root.m_pLeft!=null) {
printTree(root.m_pLeft);
}
if(root.m_pRight!=null) {
printTree(root.m_pRight);
}
}
}
public static void main(String[] args) {
MS_15 ms15 = new MS_15();
ms15.reverseTree(node1);
System.out.println();
printTree(node1);
}
class BSTreeNode {
BSTreeNode m_pLeft;
BSTreeNode m_pRight;
int m_nValue;
}
}
【微软100题】输入一颗二元查找树,将该树转换为它的镜像
最新推荐文章于 2022-05-27 19:26:13 发布