编程题练习日记-2-二叉树遍历

本文介绍了一种非递归方式实现二叉树的前序和中序遍历算法,通过栈来辅助实现遍历过程,避免了递归带来的调用栈开销,并详细解释了遍历过程中需要注意的问题。

前序中序后序,按层次。

这里递归的很好写就不写了,主要复习非递归的。

树:         4
         2     6  
       1  3   5  7 
              8
          10

非递归前序:

/**
    UnRecursive PreOrder, 非递归前序遍历
 **/
 PreOrder(BinaryTree<T> root) {
    Stack s = new Stack();
	Node n = root ;
	s.push(n) ;
	while(n!=null || !s.empty()) { 
		while(n!=null) {
		   println(n)
		   n = n->left 
		   s.push(n)
		}
		 
		if(!s.empty()) {
	 	   n = s.pop();
           s.push(n->right) ;			
		}
	}
 }
非递归前序遍历: 4   2   1   3   6   5   7   8   10 

首轮写的时候两个忘记的地方:

//非递归前序遍历没注意到的两个问题:
 1)n!=null || !s.empty() 应该是||,因为访问至最左下角1的时候,需要先将1的left进栈,发现空后pop1,
 然后push1的右孩子,其实还是空,然后进入下一个大循环,此时如果使用&&就跳出了,应该用||使得继续直接执行至pop1的父亲2,然后继续。
 2) if(!s.empty()) {  }  //注意这里栈pop前添加判断有助于防止空栈溢出。

 /**
    UnRecursive InOrder, 非递归中序遍历
  **/
  InOrder(BiNode T) {
     Stack s = new Stack() ;
while(T!=null||!s.empty()) {
   while(T!=null) {
  s.push(T->left) ;
  T = T->left ;
}

if(!s.empty()) {
  T = s.pop() ;
  println(T);
  T = T->right ;
}
}
  }
 
 
 非递归中序遍历:1 2 3 4 5 6 7 8 10 
 


头歌(Tougo)是一个在线实践教学平台,其中包含了丰富的编程题实训内容,包括数据结构和算法相关的题目。对于“二叉树”的Python版练习,通常会涉及到以下几个方面: ### 二叉树的基础知识 1. ****是一种非线性的数据结构,由节点组成,并通过边连接起来形成层次关系。最常用的形结构之一就是二叉树2. **二叉树**是指每个节点最多有两个子节点的型结构,分为左孩子和右孩子。 --- ### Python实现二叉树的基本操作 以下是关于如何用Python创建、遍历以及处理二叉树的一些基本示例代码: #### 定义一个二叉树节点类 `TreeNode` ```python class TreeNode: def __init__(self, value): self.val = value # 节点值 self.left = None # 左子节点 self.right = None # 右子节点 ``` #### 构建一棵简单的二叉树 假设我们构建下面这棵简单二叉树: ``` 1 / \ 2 3 / 4 ``` 可以用如下的代码表示: ```python # 创建根节点和其他节点 root = TreeNode(1) node2 = TreeNode(2) node3 = TreeNode(3) node4 = TreeNode(4) # 连接左右子 root.left = node2 root.right = node3 node2.left = node4 ``` #### 遍历方法 常见的二叉树遍历有三种方式:前序遍历、中序遍历和后序遍历。 ##### 前序遍历 (Pre-order Traversal) --> 左 -> 右 递归实现: ```python def pre_order_traverse(node): if not node: return [] result = [node.val] result += pre_order_traverse(node.left) result += pre_order_traverse(node.right) return result print(pre_order_traverse(root)) # 输出应该是[1, 2, 4, 3] ``` ##### 中序遍历 (In-order Traversal) --> 根 -> 右 递归实现: ```python def in_order_traverse(node): if not node: return [] result = in_order_traverse(node.left) result.append(node.val) result += in_order_traverse(node.right) return result print(in_order_traverse(root)) # 输出应该是[4, 2, 1, 3] ``` ##### 后序遍历 (Post-order Traversal) --> 右 -> 根 递归实现: ```python def post_order_traverse(node): if not node: return [] result = post_order_traverse(node.left) result += post_order_traverse(node.right) result.append(node.val) return result print(post_order_traverse(root)) # 输出应该是[4, 2, 3, 1] ``` --- ### 练习建议 1. 尝试手动构造更复杂的二叉树并完成以上几种遍历2. 实现二叉搜索(Binary Search Tree),支持插入新元素的功能。 3. 编写删除某个节点的操作函数。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值