括号字符串表示的二叉树,用栈转换为树结构

题目描述:字符串str="1(2(3,4(,5)),6(7,))"表示一棵二叉树,其中A(B,C)表示A为根结点,B和C为A的左右子节点。根据字符串输出二叉树的中序遍历。

思路:利用栈记录当前构建子树的根结点,利用方向标识记录当前构建子树方向(左子树/右子树)。具体步骤如下:

1. 遇到左括号,说明开始构建新的子树,将左括号之前的值入栈并且将方向flag置为true(表示接下来构建左子树)。此时栈顶记录的是当前构造子树的根结点;

2. 遇到右括号,说明当前子树构建完毕,将栈顶元素弹出,并且将方向flag置为false。因为当前子树构建完毕,接下来只能是构造右子树或者继续向上回溯(向上回溯后也是构造右子树,因此相同的处理),flag置为false;

3. 遇到逗号,说明左子树构建完成,接下来构建右子树,将方向flag置为false。

4. 遇到普通value,将value包装为结点,根据方向flag连接到栈顶元素的左子节点/右子节点。

    //结点数据结构
    class MiNode{
        char val;
        MiNode left=null,right=null;

        MiNode(char val){
            this.val=val;
        }
    }
    
    //树的中序遍历
    public StringBuffer midTrace(MiNode root){
        StringBuffer answer=new StringBuffer();
        if(root==null) return answer;

        answer.append(midTrace(root.left));
        answer.append(root.val);
        answer.append(midTrace(root.right));

        return answer;
    }

    //将字符串转换为树结构
    public String midTraceByStack(String str){
        String answer="";
        if(str==null||str.length()==0) return answer;

        char[] chars=str.toCharArray();
        Stack<MiNode> stack=new Stack<>();
        boolean dircFlag=true;

        //临时变量
        int length=chars.length;
        char currentValue=chars[0];
        MiNode node=new MiNode(currentValue);
        //保存根结点位置
        MiNode root=node;

        for(int i=1;i<length;i++){
            currentValue=chars[i];
            //当前字符的四种情况
            if(currentValue=='('){
                stack.push(node);
                dircFlag=true;
            }
            else if(currentValue==')'){
                stack.pop();    
                dircFlag=false;
            }
            else if(currentValue==','){
                dircFlag=false;
            }
            else{
                node=new MiNode(currentValue);
                if(dircFlag){
                    stack.peek().left=node;
                }
                else{
                    stack.peek().right=node;
                }
            }
        }
        //树的中序遍历
        answer=midTrace(root).toString();
        return answer;
    }

 

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
题目描述: 以二叉链表存储结构创建如下图的二叉树,输入时将下图二叉树变为基于括号表示字符串。创建二叉树和实现二叉树的三种遍历和层次遍历。最后求出叶子节点个数和二叉树深度。 回答: 这道题的意思是要求以二叉链表存储结构创建给定的二叉树,并将其转换为基于括号表示字符串。然后实现二叉树的先序、中序、后序和层次遍历。最后求出该二叉树的叶子节点个数和深度。 具体实现方法可以参考以下步骤: 一、根据给定的二叉树图示,手动创建每个节点的二叉链表,并将其存储在对应的二叉树节点结构体中。 二、编写函数实现将二叉树转换为基于括号表示字符串。具体实现方法可以参考以下步骤: 1. 对于空节点,返回空字符串。 2. 对于非空节点,将其值转换字符串,并递归处理左右子得到左括号、子字符串、右括号,然后将它们拼接起来即可。 三、编写函数实现二叉树的先序、中序、后序遍历。具体实现方法可以参考以下步骤: 1. 对于空节点,直接返回。 2. 对于非空节点,先访问该节点,然后递归遍历其左子和右子。先序遍历是先访问根节点,中序遍历是中间访问,后序遍历是最后访问根节点。 四、编写函数实现二叉树的层次遍历。具体实现方法可以参考以下步骤: 1. 将根节点压入队列。 2. 取出队首节点,并访问该节点。 3. 将该节点的左右子(如果有的话)分别压入队列。 4. 重复步骤2和步骤3,直到队列为空。 五、编写函数实现求出二叉树的叶子节点个数和深度。具体实现方法可以参考以下步骤: 1. 对于空节点,返回0。 2. 对于叶子节点,返回1。 3. 对于非叶子节点,递归求出其左右子的叶子节点个数和深度,然后将它们相加得到该节点的叶子节点个数和深度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值