树的前、中、后序遍历

 

import java.util.Stack;

/**
 * @Author: 
 * @Date: 2018/9/28 11:36
 */

public class TreeSort {
    public static void main(String[] args) {
        TreeNode level4_1 = new TreeNode(8,null,null);
        TreeNode level4_2 = new TreeNode(9,null,null);
        TreeNode level3_1 = new TreeNode(4,null,null);
        TreeNode level3_2 = new TreeNode(5,level4_1,level4_2);
        TreeNode level3_3 = new TreeNode(6,null,null);
        TreeNode level3_4 = new TreeNode(7,null,null);
        TreeNode level2_1 = new TreeNode(2,level3_1,level3_2);
        TreeNode level2_2 = new TreeNode(3,level3_3,level3_4);
        TreeNode root = new TreeNode(1,level2_1,level2_2);
        Stack<TreeNode> stack = new Stack();
        preOrderSort(stack,root.getLeft(),root,root.getRight());
        System.out.println("前-----------");
        while(stack.size()!=0) {
            System.out.println(stack.pop().getVal());
        }
        System.out.println("中-----------");

        midOrderSort(stack,root.getLeft(),root,root.getRight());
        while(stack.size()>0) {
            System.out.println(stack.pop().getVal());
        }
        System.out.println("后-----------");
        backOrderSort(stack,root.getLeft(),root,root.getRight());
        while(stack.size()!=0) {
            System.out.println(stack.pop().getVal());
        }
        System.out.println("深度-----------="+depthTree(root));
        System.out.println("宽度-----------="+widthTree(root));

    }

    private static int widthTree(TreeNode root) {
        Stack<TreeNode> cStack = new Stack<>();
        cStack.push(root);
        int maxWidth = cStack.size();
        while(true) {
            Stack<TreeNode> stack = new Stack<>();
            while(cStack.size()>0) {
                TreeNode node = cStack.pop();
                TreeNode nodeLeft = node.getLeft();
                if(nodeLeft!=null) {
                    stack.push(nodeLeft);
                }
                TreeNode nodeRight = node.getRight();
                if(nodeRight!=null) {
                    stack.push(nodeRight);
                }
            }
            cStack = stack;
            maxWidth = Math.max(maxWidth,stack.size());
            if(stack.size()==0) {
                break;
            }
        }
        return maxWidth;
    }

    private static int depthTree(TreeNode node) {
        if(node!=null) {
            if(node.getLeft()==null && node.getRight() ==null) {
                return 1;
            }else {
                int countLeft = 0;
                if(node.getLeft()!=null) {
                    countLeft = depthTree(node.getLeft());
                }
                int countRight = 0;
                if(node.getRight() !=null) {
                    countRight = depthTree(node.getRight());
                }
                return 1 + Math.max(countLeft,countRight);
            }
        }else {
            return 0;
        }
    }

    private static void backOrderSort(Stack<TreeNode> cStack,TreeNode leftNode,TreeNode node,TreeNode rightNode) {
        if(leftNode!=null) {
            if(leftNode.getLeft()==null) {
                cStack.push(leftNode);
            }else {
                backOrderSort(cStack,leftNode.getLeft(),leftNode,leftNode.getRight());
            }
        }
        if(rightNode!=null) {
            if(rightNode.getLeft()==null && rightNode.getRight()==null ) {
                cStack.push(rightNode);
            }else {
                backOrderSort(cStack,rightNode.getLeft(),rightNode,rightNode.getRight());
            }
        }
        cStack.push(node);
    }

    private static void midOrderSort(Stack<TreeNode> cStack,TreeNode leftNode,TreeNode node,TreeNode rightNode) {
        if(leftNode!=null) {
            if(leftNode.getLeft()==null) {
                cStack.push(leftNode);
            }else {
                midOrderSort(cStack,leftNode.getLeft(),leftNode,leftNode.getRight());
            }
        }
        cStack.push(node);
        if(rightNode!=null) {
            if(rightNode.getLeft()==null && rightNode.getRight()==null ) {
                cStack.push(rightNode);
            }else {
                midOrderSort(cStack,rightNode.getLeft(),rightNode,rightNode.getRight());
            }
        }
    }

    private static void preOrderSort(Stack<TreeNode> cStack,TreeNode leftNode,TreeNode node,TreeNode rightNode) {
        cStack.push(node);
        if(leftNode!=null) {
            if(leftNode.getLeft()==null) {
                cStack.push(leftNode);
            }else {
                preOrderSort(cStack,leftNode.getLeft(),leftNode,leftNode.getRight());
            }
        }
        if(rightNode!=null) {
            if(rightNode.getLeft()==null && rightNode.getRight()==null ) {
                cStack.push(rightNode);
            }else {
                preOrderSort(cStack,rightNode.getLeft(),rightNode,rightNode.getRight());
            }
        }
    }
}

class TreeNode{
    private int val;
    private TreeNode left;
    private TreeNode right;
    public TreeNode(int val,TreeNode left,TreeNode right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }

    public int getVal() {
        return val;
    }

    public TreeNode getLeft() {
        return left;
    }

    public TreeNode getRight() {
        return right;
    }
}

 

转载于:https://www.cnblogs.com/use-D/p/9721150.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉是一种常见的数据结构,在iOS开发,我们经常会涉及到对二叉进行遍历。常见的遍历方式包括序遍历、序遍历和后序遍历序遍历是指首先访问根节点,然后按照先左后右的顺序递归遍历左右子。在iOS,可以使用递归或者栈来实现序遍历,具体实现如下: ``` - (void)preOrderTraversal:(Node *)rootNode { if (rootNode) { NSLog(@"%d", rootNode.value); // 访问根节点 [self preOrderTraversal:rootNode.leftNode]; // 遍历左子 [self preOrderTraversal:rootNode.rightNode]; // 遍历右子 } } ``` 序遍历是指首先遍历左子,然后访问根节点,最后遍历右子。同样,可以使用递归或者栈来实现序遍历,具体实现如下: ``` - (void)inOrderTraversal:(Node *)rootNode { if (rootNode) { [self inOrderTraversal:rootNode.leftNode]; // 遍历左子 NSLog(@"%d", rootNode.value); // 访问根节点 [self inOrderTraversal:rootNode.rightNode]; // 遍历右子 } } ``` 后序遍历是指首先遍历左子,然后遍历右子,最后访问根节点。同样,可以使用递归或者栈来实现后序遍历,具体实现如下: ``` - (void)postOrderTraversal:(Node *)rootNode { if (rootNode) { [self postOrderTraversal:rootNode.leftNode]; // 遍历左子 [self postOrderTraversal:rootNode.rightNode]; // 遍历右子 NSLog(@"%d", rootNode.value); // 访问根节点 } } ``` 以上是iOS实现二叉后序遍历的一种方式,具体的实现方式可以根据实际需求进行灵活调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值