二叉树,就是每个节点最多只有两个子节点类树结构(应该二叉树可以为空,但是树的定义要求树不为空,所以我称他为类树结构)。
二叉树的非递归遍历的泛华代码与解释如下:
首先定义二叉树的二叉链结构
template<typename NT> struct BTnood{ NT data; BTnood* lc; BTnood* rc; BTnood(NT const& v=NT(),BTnood* lc_=0,BTnood* rc_=0):data(v),lc(lc_),rc(rc_){} bool haslc(){return !lc==0;} bool hasrc(){return !rc==0;} };
首先是二叉树的非递归先序遍历:
其实思路就是递归遍历的循环方式实现而已。
首先访问输出根节点,当该节点有右子节点的时候先把其压栈,然后访问左子节点,并把左子节点作为新的根节点,知道最深层的根节点没有子节点为止,然后出栈访问左子节点-》右子节点:
//先序遍历 --- 非递归 template<typename NT> void preorder(NT* root,void (*Visit)(NT*)) { if(root!=0) { std::stack<NT*> s; while(true) { Visit(root); if(root->hasrc()) s.push(root->rc); if(root->haslc()) s.push(root->lc()); else { if(s.empty()) return; root = s.top();s.pop(); } } } }
二叉树的非递归中序遍历:
中序遍历的访问顺序是,左子节点->根节点->右子节点
那么就要先找到最深处的左子节点啊,所以在while循环中,将所有左子节点入栈,知道没有左子节点时就可以输出其本身,然后判断是否有右子节点,如果有则入栈,进入下一轮循环以便判断其是否有左子节点需要先与其输出
//中序遍历 非递归 template<typename NT> void inorder(NT* root,void (*Visit)(NT*)) { if(root == 0) return; std::stack<NT*> s; s.push(root); while(true) { root = s.top(); while(root->haslc()) s.push(root=root->lc); Visit(root); if(root->hasrc()) s.push(root->rc); else { do { Visit(root=s.top()); s.pop(); }while(!root->hasrc()||!s.empty()); } } }