二分搜索树的前、中、后序遍历详解(寿司代码)

目录

—节点类的设计
—前序遍历
—中序遍历
—后序遍历
—三种遍历的总结

===================奇妙的分割线++++++++++++++++++++++++++++++

节点类的设计

private class Node{
		public E e;
		public Node left,right;
		
		public Node(E e) {
			this.e = e;
			left = null;
			right = null;
		}
	}

前序遍历

前序遍历是二分搜索树最自然的遍历

//二分搜索树的前序遍历
	public void preOrder() {
		preOrder(root);
	}
	
	//前序遍历以node为根的二分搜索树,递归算法
	private void preOrder(Node node) {
		
		if(node == null)  //递归结束条件
			return;
		
		System.out.println(node.e);  //对节点进行操作   
		preOrder(node.left);
		preOrder(node.right);
	}

模拟输入测试数据{5,3,6,8,4,2,1,7}得到的结果:

2
1
4
6
8
7

先对节点进行操作,再进行左右孩子的遍历,是前序遍历

中序遍历

中序遍历的结果可以实现对二分搜索树的自然排序

//二分搜索树的中序遍历
	public void inOrder() {
		inOrder(root);
	}
	
	//中序遍历以node为根的二分搜索树,递归算法
	private void inOrder(Node node) {
		
		if(node == null)  //递归终止条件
			return;
		
		inOrder(node.left);
		System.out.println(node.e);  //对节点进行操作
		inOrder(node.right);
	}

模拟输入测试数据{5,3,6,8,4,2,1,7}得到的结果:

1
2
3
4
5
6
7
8

在对左右孩子的遍历之间对节点进行操作,是中序遍历

后序遍历

后序遍历特点在于应用,最后进行说明

//二分搜索树的后序遍历
	public void postOrder() {
		postOrder(root);
	}
	
	//后序遍历以node为根的二分搜索树,递归算法
	private void postOrder(Node node) {
		
		if(node ==null)  //递归终止条件
			return;
		
		postOrder(node.left);
		postOrder(node.right);
		System.out.println(node.e);  //对节点进行操作
	}

模拟输入测试数据{5,3,6,8,4,2,1,7}得到的结果:

1
2
4
3
7
8
6
5

先对左右孩子遍历,最后对节点进行操作是后序遍历

三种遍历的特点和应用

在对一个二分搜索树进行遍历的时候,每一个节点都会被访问三次
第一次访问就操作————前序遍历
第二次访问才操作————中序遍历
第三次访问才操作————后序遍历
前序遍历最自然,中序遍历可以用于排序,而后序遍历则可以用于对树进行内存释放。Java中有垃圾自动回收机制,所以后序遍历在Java中不会过多的应用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是二叉树后序遍历的 C 代码示例: ```c #include <stdio.h> #include <stdlib.h> // 定义二叉树结构体 typedef struct TreeNode { int val; struct TreeNode* left; struct TreeNode* right; } TreeNode; // 创建一个二叉树节点 TreeNode* createTreeNode(int val) { TreeNode* node = (TreeNode*)malloc(sizeof(TreeNode)); node->val = val; node->left = NULL; node->right = NULL; return node; } // 前序遍历 void preorderTraversal(TreeNode* root) { if (root == NULL) { return; } printf("%d ", root->val); // 先访问根节点 preorderTraversal(root->left); // 再遍历左子 preorderTraversal(root->right); // 最后遍历右子 } // 遍历 void inorderTraversal(TreeNode* root) { if (root == NULL) { return; } inorderTraversal(root->left); // 先遍历左子 printf("%d ", root->val); // 再访问根节点 inorderTraversal(root->right); // 最后遍历右子 } // 后序遍历 void postorderTraversal(TreeNode* root) { if (root == NULL) { return; } postorderTraversal(root->left); // 先遍历左子 postorderTraversal(root->right); // 再遍历右子 printf("%d ", root->val); // 最后访问根节点 } int main() { // 创建二叉树 TreeNode* root = createTreeNode(1); root->left = createTreeNode(2); root->right = createTreeNode(3); root->left->left = createTreeNode(4); root->left->right = createTreeNode(5); root->right->left = createTreeNode(6); root->right->right = createTreeNode(7); // 前序遍历 printf("Preorder traversal: "); preorderTraversal(root); printf("\n"); // 遍历 printf("Inorder traversal: "); inorderTraversal(root); printf("\n"); // 后序遍历 printf("Postorder traversal: "); postorderTraversal(root); printf("\n"); return 0; } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值