Morris遍历

解释:点击打开链接

#include<string>
#include<vector>
#include<iostream>
#include<queue>
#include<unordered_set>
#include<algorithm>
#include<cassert>
#include<list>
#include<map>
#include<fstream>
#include<memory>

using namespace std;

struct bst_node
{
	int key;
	bst_node *left;
	bst_node *right;
	bst_node(int i):key(i),left(NULL),right(NULL) { }
};

void bst_morris_inorder(struct bst_node *root)  {  
   struct bst_node *p = root, *tmp;//p指向当前子树的根节点
   while (p) {  
       if (p->left == NULL) {  //当前子树的左子树为空
           printf("%d ", p->key);  
           p = p->right;  
       }  
       else { //当前子树的左子树不为空
           tmp = p->left;  
		   //tmp尝试将当前子树的左子树的最右孩子节点的后继结点设为p(保存后继信息)
           while (tmp->right != NULL && tmp->right != p)  
               tmp = tmp->right;  
           if (tmp->right == NULL) {  
               tmp->right = p;  //保存后继信息
               p = p->left;  
           }  
           else {  //这种情况说明由保存的后继信息回退到根节点再次尝试保存后继信息(说明左子树已访问过)
               printf("%d ", p->key);  
               tmp->right = NULL;  //还原
               p = p->right;  
           }  
       }  
   }  
}  
int main ()
{
	bst_node n1(1),n2(2),n3(3),n4(4),n5(5),n6(6);
	n1.left=&n2,n1.right=&n3;
	n2.left=&n4,n2.right=&n5;
	n3.left=&n6;
	bst_morris_inorder(&n1);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值