算法:Morries法遍历二叉树

今天看了下左神讲的有关morries遍历二叉树的视频(morries遍历,学术上就是线索化遍历二叉树),这种遍历方法没有用到其他辅助数据结构,只使用了叶子结点的空闲指针,节省了许多不必要的开销,同时也加快了遍历的时间效率,下面我来总结

核心要点(步骤)

  1. 初始化线索结点,名字叫做cur,指向树的根结点
  2. 如果cur没有左孩子,cur右移,cur指向cur的右孩子结点(cur = cur->right)
  3. 如果cur有左孩子,重点来了,找到cur左子树上的最右的孩子结点,名字叫做mostRight
  4. 如果mostRight的右孩子为空,让右指针指向cur,cur左移(cur = cur->left)
  5. 如果mostRight的右孩子指向cur,让其右指针重新置为空,cur右移(cur = cur->right)
  6. 如果cur为空,遍历结束

前序遍历模板

void morris(TreeNode* root){
	if(!root){
		return;
	}
	TreeNode* cur = root;
	TreeNode* mostright = nullptr;
	while(cur){
		mostright = cur->left;
		if(mostright){
			while(mostright->right && mostright->right!=cur){
				mostright = mostright->right;
			}
			if(!mostright->right){
				mostright->right = cur;
				cout<<cur->val;
				cur = cur->left;
				continue;
			}else{
				mostright->right = nullptr;
			}
		}else{
			cout << cur->val;
		}
		cur = cur->right;
	}
}

图表示步骤
在这里插入图片描述
由于morries遍历有个特点,对于有左右孩子的结点,这个结点会有两次机会被遍历到,而叶子结点就只能被遍历到一次,所以要注意输出打印语句的时机,今天就写这么多,有点困,下次补充叭

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值