三叉树的垂直输出(Java实现)

简介: 三叉树的垂直输出(Java实现)

三叉树的垂直输出(Java实现)


这是2020酷家乐的笔试真题


三叉树的结构如下图。



20200315100513511.png

要求:

任选一种编程语言,实现功能。

写函数,垂直输出元素值。

输出的结果如下:


A,B,D,
A,C,G,
A,C,K,



代码实现,利用深度优先搜索和回溯法求解

首先构建节点类

class Node{
    String value;//节点值,如果节点值为null,则其没有子节点
    Node left;//左子节点
    Node middle;//中间子节点
    Node right;//有子节点
    public Node(String value) {
        this.value = value;
    }
    @Override
    public String toString() {
        return value;
    }
}

然后深度优先搜索

package Day43;
import java.util.ArrayList;
import java.util.Stack;
/**
 * @Author Zhongger
 * @Description 三叉树的垂直输出
 * @Date 2020.3.15
 */
public  class PrintTreeVerticalSolution {
    public static void main(String[] args) {
        Node root = new Node("A");
        Node b = new Node("B");
        Node c = new Node("C");
        Node d = new Node("D");
        Node g = new Node("G");
        Node k = new Node("K");
        root.left=b;
        root.right=c;
        b.right=d;
        c.left=g;
        c.right=k;
        printTreeVertical(root);
    }
    public static void printTreeVertical(Node root){
        Stack<Node> stack = new Stack<>();
        if (root==null){
            return;
        }
        stack.push(root);
        trace(stack);//递归处理
    }
    public static void trace(Stack<Node> stack){
        if (stack.isEmpty()){
            return;
        }
        Node current = stack.peek();//当前元素
        //叶子节点,表示一次遍历完成后,就可以输出了
        if (current.left==null&&current.middle==null&&current.right==null){
            ArrayList<Node> list = new ArrayList<>(stack);
            System.out.println(list);
            //输出路径
            StringBuffer stringBuffer = new StringBuffer(100);
            for (final Node temp : list) {
                stringBuffer.append(temp.value).append(",");
            }
            System.out.println(stringBuffer.toString());
            //删除一个元素
            stack.pop();
            System.out.println(stack.toString());
            return;
        }
        //把每个条件都遍历一遍
        if (current.left!=null){
            stack.push(current.left);
            trace(stack);
        }
        if (current.middle!=null){
            stack.push(current.middle);
            trace(stack);
        }
        if (current.right!=null){
            stack.push(current.right);
            trace(stack);
        }
    }
}

答案虽然输出有些偏差,但是体现了思想就可以了。


评分标准:


1、体现深度遍历算法 +10分

2、栈式结构,stack、list均可 +4分

3、循环或递归,判断好边界 +6分

4、视答案完成度略微扣分

相关文章
|
4月前
|
存储 Java
1038. 从二叉搜索树到更大和树 --力扣 --JAVA
给定一个二叉搜索树 root (BST),请将它的每个节点的值替换成树中大于或者等于该节点值的所有节点值之和。 提醒一下, 二叉搜索树 满足下列约束条件: 节点的左子树仅包含键 小于 节点键的节点。 节点的右子树仅包含键 大于 节点键的节点。 左右子树也必须是二叉搜索树。
56 1
|
3月前
|
存储 算法 Java
Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。
【6月更文挑战第21天】Java中,树与图的算法涉及二叉树的前序、中序、后序遍历以及DFS和BFS搜索。二叉树遍历通过访问根、左、右子节点实现。DFS采用递归遍历图的节点,而BFS利用队列按层次访问。以下是简化的代码片段:[Java代码略]
39 4
|
4月前
|
Java
Tree Traversals Again(Java语言)(先序和中序创建二叉树)(遍历树)
Tree Traversals Again(Java语言)(先序和中序创建二叉树)(遍历树)
38 4
|
1月前
|
存储 Java
|
1月前
|
存储 Java
|
3月前
|
存储 安全 Java
深入解析Java HashMap的高性能扩容机制与树化优化
深入解析Java HashMap的高性能扩容机制与树化优化
121 1
|
3月前
|
Java
JAVA中的AVL树实现
JAVA中的AVL树实现
38 1
|
3月前
|
Java
赫夫曼树(java)
赫夫曼树(java)
|
3月前
|
算法 Java Go
【经典算法】LeetCode 100. 相同的树(Java/C/Python3/Go实现含注释说明,Easy)
【经典算法】LeetCode 100. 相同的树(Java/C/Python3/Go实现含注释说明,Easy)
25 0
|
4月前
|
SQL Java 关系型数据库
java 递归返回树形组织结构(附带树形菜单的搜索)
java 递归返回树形组织结构(附带树形菜单的搜索)
65 0