二叉树进阶题------二叉树的构建及遍历;二叉搜索树转换成排序双向链表;二叉树创建字符串

Posted 小写丶H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树进阶题------二叉树的构建及遍历;二叉搜索树转换成排序双向链表;二叉树创建字符串相关的知识,希望对你有一定的参考价值。

进阶题

一.二叉树的构建及遍历

编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。

代码

public class Main 
    static class TreeNode
        public char val;
        TreeNode left;
        TreeNode right;
 
        public TreeNode(char val) 
            this.val = val;
        
    
 
    public static void main(String[] args) 
        Scanner scanner=new Scanner(System.in);
        while (scanner.hasNext())
            String s=scanner.next();
            TreeNode root=bulid(s);
            inOrder(root);
            System.out.println();
        
    
 
    private static int index=0;
    private static TreeNode bulid(String s) 
        index=0;
        return creatTreePreOrder(s);
    
 
    private static TreeNode creatTreePreOrder(String s) 
        char cur=s.charAt(index);
        if(cur=='#')
            return null;
        
        TreeNode root=new TreeNode(cur);
        index++;
        root.left=creatTreePreOrder(s);
        index++;
        root.right=creatTreePreOrder(s);
        return root;
    
     
    public static void inOrder(TreeNode root)
        if(root.left!=null)
            inOrder(root.left);
             
        
        System.out.print(root.val+" ");
        if(root.right!=null)
            inOrder(root.right);
        
    

二.二叉树搜索树转换成排序双向链表

输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表(要求不能创建任何新的结点,只能调整树中结点指针的指向。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继)

思路

首先我们知道二叉搜索树的一个特点,左子树所有节点小于根节点,根节点小于右子树所有节点。
这一题的突破口就是,中序遍历,其中序遍历是一个有序数组。

递归解题,深度递归,然后到最左的子树然后开始调整,左子树调整完,然后是右子树,中间根节点相连接。

具体的细节看代码就可以了。

代码

public class Solution 
     //存储链表头结点
    TreeNode root=null;
    //前驱结点
    TreeNode pre=null;
    public TreeNode Convert(TreeNode pRootOfTree) 
        if (pRootOfTree==null)
        	return null;
        
        // 递归遍历连接左子树
        Convert(pRootOfTree.left);
        // 存下来了最左边的子树,也就是链表的开头
        if (root==null)
            root=pRootOfTree;
        
        // 修改结点为双向链表
        if (pre!= null)
            pRootOfTree.left=pre;
            pre.right=pRootOfTree;
        
        // 注意更新pre
        pre=pRootOfTree;
        // 递归遍历连接右子树
        Convert(pRootOfTree.right);
        return root;
    

三.二叉树创建字符串

你需要采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。
空节点则用一对空括号 “()” 表示。而且你需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。

代码

class Solution 
    private StringBuffer sb=new StringBuffer();
    public String tree2str(TreeNode root) 
        if(root==null)
            return "";
        
        helper(root);

        sb.deleteCharAt(0);
        sb.deleteCharAt(sb.length()-1);
        return sb.toString();
    

    private void helper(TreeNode root) 
        if(root==null)
            return;
        
        sb.append("(");
        sb.append(root.val);
        //左子树为空,右子树不为空,这种情况要加()
        if(root.left==null&&root.right!=null)
            sb.append("()");
        
        helper(root.left);
        helper(root.right);
        sb.append(")");
    

以上是关于二叉树进阶题------二叉树的构建及遍历;二叉搜索树转换成排序双向链表;二叉树创建字符串的主要内容,如果未能解决你的问题,请参考以下文章

二叉树进阶题------二叉树的构建及遍历;二叉搜索树转换成排序双向链表;二叉树创建字符串

二叉树相关面试题数据结构

树与二叉树数据结构详解

二叉树进阶题------前序遍历和中序遍历构造二叉树;中序遍历和后序遍历构造二叉树

二叉树进阶题------前序遍历和中序遍历构造二叉树;中序遍历和后序遍历构造二叉树

二叉树的实现遍历及面试题