二叉树的遍历和求二叉树的最长路径

二叉树作为最常碰到和最基础的数据结构,今天来聊一聊二叉树的遍历

二叉树的遍历分为深度优先遍历和广度优先遍历,其中,深度优先遍历又分为先序遍历,中序遍历和后序遍历三种。

先,中,后都是根据根节点而言的 ,即:

先序遍历:根——左——右

中序遍历:左——根——右

后序遍历:左——右——根

一 深度优先遍历递归实现

深度优先遍历递归的逻辑实现比较简单,就不多做解释,代码如下,相信都能看懂

//先序遍历	
public  void preOrderTraverse(TreeNode root) {
	if (root== null)
		return;
	System.out.print(root.val+ " ");
	preOrderTraverse(root.left);
	preOrderTraverse(root.right);
}

//中序遍历
public  void inOrderTraverse(TreeNode root) {
	if (root== null)
		return;
	inOrderTraverse(root.left);
	System.out.print(root.val+ " ");
	inOrderTraverse(root.right);
}

//后序遍历
public  void postOrderTraverse(TreeNode root) {
	if (root== null)
		return;
	postOrderTraverse(root.left);
	postOrderTraverse(root.right);
	System.out.print(root.val+ " ");
}

上面都是递归遍历,下面看一下非递归遍历,非递归遍历需要借助到栈

二  深度优先遍历非递归实现

深度优先遍历的非递归实现需要借助到栈作为辅助,代码如下

    //先序遍历
    public void preOrderTraverse(TreeNode root){
        if(root==null){
            System.out.println("empty tree");
        }else{
            LinkedList<TreeNode> stack=new LinkedList();
            TreeNode node=root;
            while(!stack.isEmpty() || node!=null){
                if(node!=null){
                    System.out.print(node.val+" ");
                    stack.push(node);
                    node=node.left;
                }else{
                    TreeNode pNode=stack.pop();
                    node=pNode.right;
                }
            }
        }
    }


    //中序遍历
    public void midOrderTraverse(TreeNode root){
        if(root==null){
            System.out.println("empty tree");
        }else{
            LinkedList<TreeNode> stack=new LinkedList();
            TreeNode node=root;
            while(!stack.isEmpty() || node!=null){
                if(node!=null){
                    stack.push(node);
                    node=node.left;
                }else{
                    TreeNode pNode=stack.pop();
                    System.out.print(pNode.val+" ");
                    node=pNode.right;
                }
            }
        }
    }

三  广度优先遍历非递归实现

广度优先遍历主要用到了队列作为辅助,代码如下

/**
     * 广度优先遍历
     * 採用非递归实现
     * 须要辅助数据结构:队列
     */
    public void levelOrderTraversal(Node root){
    	System.out.println("广度优先遍历");
        if(root==null){
            System.out.println("empty tree");
            return;
        }
        ArrayDeque<Node> queue=new ArrayDeque<Node>();
        queue.add(root);
        while(queue.isEmpty()==false){
        	Node node=queue.remove();
            System.out.print(node.data+ " ");
            if(node.leftChild!=null){
                queue.add(node.leftChild);
            }
            if(node.rightChild!=null){
                queue.add(node.rightChild);
            }
        }
        System.out.print("\n");
    }

四  求二叉树的最长路径递归算法

最长路径即从根节点到其所有叶子节点的路径中,找到那个最长的。

public int getlength(TreeNode root){
    if(root==null){
        return 0;
    }else{
        int left=getlength(root.left);   
        int right=getlength(root.right);
        return Math.max(left,right)+1;
    }
}

五  求二叉树的最长路径非递归算法

求二叉树最长路径的非递归算法其实是和层次遍历的逻辑一样的,算一下该二叉树有多少层就是最长路径,代码如下

    public static int getDepth(TreeNode root){
        if(root==null){
            return 0;
        }else{
            //记录二叉树的高度
           int depth=0;
           //记录遍历到当前层的第几个节点
            int num=0;
            //记录当前层的节点个数
            int count=1;
            LinkedList<TreeNode> queue=new LinkedList<>();
            queue.add(root);
            while(!queue.isEmpty()){
                TreeNode node=queue.remove();
                num++;
                if(node.left!=null){
                    queue.add(node.left);
                }
                if(node.right!=null){
                    queue.add(node.right);
                }
                if(num==count){
                    depth++;
                    num=0;
                    count=queue.size();
                }
            }
           return depth;
        }
    }

 

  • 8
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个示例代码,可以二叉树最长路径并输出结点: ```c #include <stdio.h> #include <stdlib.h> // 二叉树结构体 typedef struct Node { int val; struct Node* left; struct Node* right; } Node; // 计算树的深度 int depth(Node* root) { if (root == NULL) { return 0; } int left_depth = depth(root->left); int right_depth = depth(root->right); return 1 + (left_depth > right_depth ? left_depth : right_depth); } // 打印最长路径 void print_longest_path(Node* root) { if (root == NULL) { return; } int left_depth = depth(root->left); int right_depth = depth(root->right); if (left_depth + right_depth > longest_path) { longest_path = left_depth + right_depth; longest_node = root; } print_longest_path(root->left); print_longest_path(root->right); } // 测试代码 int main() { // 创建一棵二叉树 Node* root = (Node*)malloc(sizeof(Node)); root->val = 1; root->left = (Node*)malloc(sizeof(Node)); root->left->val = 2; root->left->left = (Node*)malloc(sizeof(Node)); root->left->left->val = 4; root->left->left->left = NULL; root->left->left->right = NULL; root->left->right = NULL; root->right = (Node*)malloc(sizeof(Node)); root->right->val = 3; root->right->left = (Node*)malloc(sizeof(Node)); root->right->left->val = 5; root->right->left->left = NULL; root->right->left->right = NULL; root->right->right = (Node*)malloc(sizeof(Node)); root->right->right->val = 6; root->right->right->left = NULL; root->right->right->right = NULL; // 计算最长路径并输出结点 print_longest_path(root); printf("最长路径为:%d-%d-%d\n", longest_node->val, longest_node->left->val, longest_node->right->val); return 0; } ``` 此代码中,`depth()` 函数用于计算树的深度,`print_longest_path()` 函数用于打印最长路径。在 `print_longest_path()` 函数中,我们首先计算左子树和右子树的深度,如果左子树深度加右子树深度大于当前最长路径,则更新最长路径最长路径的结点。最后递归遍历左子树和右子树即可。在测试代码中,我们创建了一棵二叉树,并进行了测试。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值