二叉树的实现及先序、中序、后序遍历

        定义

                    二叉树:在数据结构中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作为

             “左子树”和右子树。二叉树通常被用于实现二叉查找树和二叉堆。

        特点

                  二叉树的每个节点至多只有两颗子树(不存在度大于2的结点),需要注意的是二叉树的子树

             是有左右之分的,次序不能颠倒。其第i层最多有2^{i-1}个结点;深度为k的二叉树最多有2^k-1

             个结点;对于任意一颗二叉树T,如果其叶子结点树为n0,度为2的结点树为n2,则n0=n2 + 2(根结

             点除外)。

                         

         存储表示

                  二叉树可以使用数组或者顺序表来表示,这种实现方式更有利于紧凑的存储和更好的访问

             局部性,但是他需要连续的存储空间,在极端的情况下,如果一颗二叉树只有右子树,那么空

             间的浪费将会异常的严重。

                  二叉树还可以使用链表的存储方式来实现,这也是推荐的实现方式。在Java中具体的树节点

             的具体表示情况如下:

class TreeNode<T> {
		private T data;
		private TreeNode<T> leftNode;
		private TreeNode<T> rightNode;

		public TreeNode(T data, TreeNode<T> leftNode, TreeNode<T> rightNode) {
			this.data = data;
			this.leftNode = leftNode;
			this.rightNode = rightNode;
		}
} 
              对于二叉树的具体操作笔者不会去详细的实现,感兴趣的是二叉树的遍历方式。

         二叉树的遍历

                    对于二叉树的遍历方式一般分为三种先序、中序、后序三种方式

                 先序遍历

                  若二叉树为空,则不进行任何操作:否则

                       1、访问根结点。

                       2、先序方式遍历左子树。

                       3、先序遍历右子树。

                中序遍历

                  若二叉树为空,则不进行任何操作:否则

                       1、中序遍历左子树。

                       2、访问根结点。

                       3、中序遍历右子树。

               后序遍历

                  若二叉树为空,则不进行任何操作:否则

                       1、后序遍历左子树。

                       2、后序遍历右子树。

                       3、放问根结点。

               遍历的情况如下:

                

                二叉树遍历的代码实现:

package com.kiritor;

/**
 * Java二叉树的实现 以及遍历
 * 
 * @author Kiritor
 */
public class BinaryTree {
	
	/**
	 * 输出结点信息*/
	public void printNode(TreeNode<String> node)
	{
		System.out.print(node.getData()+"  ");
	}
	/**
	 * 定义结点
	 * */
	class TreeNode<T> {
		private T data;
		private TreeNode<T> leftNode;
		private TreeNode<T> rightNode;

		public TreeNode(T data, TreeNode<T> leftNode, TreeNode<T> rightNode) {
			this.data = data;
			this.leftNode = leftNode;
			this.rightNode = rightNode;
		}
		

		public T getData() {
			return data;
		}

		public void setData(T data) {
			this.data = data;
		}

		public TreeNode<T> getLeftNode() {
			return leftNode;
		}

		public void setLeftNode(TreeNode<T> leftNode) {
			this.leftNode = leftNode;
		}

		public TreeNode<T> getRightNode() {
			return rightNode;
		}

		public void setRightNode(TreeNode<T> rightNode) {
			this.rightNode = rightNode;
		}

	}

	// 初始化二叉树
	public TreeNode<String> init() {
		TreeNode<String> D = new TreeNode<String>("D", null, null);
		TreeNode<String> H = new TreeNode<String>("H", null, null);
		TreeNode<String> I = new TreeNode<String>("I", null, null);
		TreeNode<String> J = new TreeNode<String>("J", null, null);
		TreeNode<String> P = new TreeNode<String>("P", null, null);
		TreeNode<String> G = new TreeNode<String>("G", P, null);
		TreeNode<String> F = new TreeNode<String>("F", null, J);
		TreeNode<String> E = new TreeNode<String>("E", H, I);
		TreeNode<String> B = new TreeNode<String>("B", D, E);
		TreeNode<String> C = new TreeNode<String>("C", F, G);
		TreeNode<String> A = new TreeNode<String>("A", B, C);
		return A;
	}
	/**先序遍历二叉树
	 * */
	public void xianIterator(TreeNode<String> node)
	{
		this.printNode(node);
		if(node.getLeftNode()!=null)
		{
			this.xianIterator(node.getLeftNode());
		}
		if(node.getRightNode()!=null)
		{
			this.xianIterator(node.getRightNode());
		}
	}
	
	/**
	 * 中序遍历二叉树*/
	public void zhongIterator(TreeNode<String> node)
	{
		if(node.getLeftNode()!=null)
		{
			this.zhongIterator(node.getLeftNode());
		}
		this.printNode(node);
		if(node.getRightNode()!=null)
		{
			this.zhongIterator(node.getRightNode());
		}
	}
	
	/**后序遍历二叉树*/
	public void houIterator(TreeNode<String> node)
	{
		if(node.getLeftNode()!=null)
		{
			this.houIterator(node.getLeftNode());
		}
		if(node.getRightNode()!=null)
		{
			this.houIterator(node.getRightNode());
		}
		this.printNode(node);
	}
	
	public static void main(String[] args) {
	   BinaryTree binaryTree = new BinaryTree();
	   TreeNode<String> node = binaryTree.init();
	   System.out.println("先序遍历的情况");
	   binaryTree.xianIterator(node);
	   System.out.println("\n中序遍历的情况");
	   binaryTree.zhongIterator(node);
	   System.out.println("\n后序遍历的情况");
	   binaryTree.houIterator(node);
	}
	
}
                    

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
二叉树先序中序后序遍历分别指的是:先访问根节点,然后遍历左子树和右子树;先遍历左子树,然后访问根节点,最后遍历右子树;先遍历左子树,然后遍历右子树,最后访问根节点。下面是Python实现二叉树先序中序后序遍历的代码: ```python class TreeNode: def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right class BinaryTree: def __init__(self, root=None): self.root = root # 先序遍历 def preorderTraversal(self, node): if node: print(node.val, end=' ') # 先访问根节点 self.preorderTraversal(node.left) # 遍历左子树 self.preorderTraversal(node.right) # 遍历右子树 # 中序遍历 def inorderTraversal(self, node): if node: self.inorderTraversal(node.left) # 遍历左子树 print(node.val, end=' ') # 访问根节点 self.inorderTraversal(node.right) # 遍历右子树 # 后序遍历 def postorderTraversal(self, node): if node: self.postorderTraversal(node.left) # 遍历左子树 self.postorderTraversal(node.right) # 遍历右子树 print(node.val, end=' ') # 访问根节点 ``` 可以使用上述代码创建一个二叉树对象,并调用其中的三个方法进行遍历,例如: ```python # 创建二叉树 root = TreeNode(1) root.left = TreeNode(2) root.right = TreeNode(3) root.left.left = TreeNode(4) root.left.right = TreeNode(5) tree = BinaryTree(root) # 先序遍历 print('先序遍历:', end='') tree.preorderTraversal(tree.root) print() # 中序遍历 print('中序遍历:', end='') tree.inorderTraversal(tree.root) print() # 后序遍历 print('后序遍历:', end='') tree.postorderTraversal(tree.root) print() ``` 输出结果为: ``` 先序遍历:1 2 4 5 3 中序遍历:4 2 5 1 3 后序遍历:4 5 2 3 1 ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值