-1.数据结构

typedef struct BNode{
	int data;
	struct BNode *lchild,*rchild;
}BNode,*BiTree;

0.操作型和计算型

1.顺序存储二叉树,求结点i和结点j的最近公共祖先结点(编号从1开始)

int func(int A[],int i,int j){
	int i0 = i / 2;
	int j0 = j / 2;
	while(i0!=1 && j0!=1){
		if(i0 == j0)
			return i0;
		else if(i0 < j0)
			j0 = j0 / 2;
		else 
			i0 = i0 / 2;
	}
	return 1;
}

2.中序非递归

void InOrder(BiTree T){
	InitStack(S);
	BiTree p = T;
	while(p!=NULL || !IsEmpty(S){
		if(p){//当前结点不空
			push(S,p);
			p = p->lchild;//当前结点入栈,p指向其左孩子
		}
		else{//当前结点为空,则栈顶出栈,p指向出栈元素的右孩子
			pop(S,p);
			visit(p);
			p = p->rchild;
		}
	}
	return ;
}

3.先序非递归

void PreOrder(BiTree T){
	BiTree p = T;
	InitStack(S);
	while(p!=NULL || IsEmpty(S)){
		if(p){
			visit(p);
			push(S,p);//访问完结点也要将结点入栈,方便后续找其右孩子
			p = p->lchild;
		}
		else{
			pop(S,p);
			p = p->rchild;
		}
	}
	return ;
}

4.后序非递归

bool GetTop(SqStack S,BiTree &x){
	if(S.top == -1)
		return false;
	x = S.data[S.top];//x记录栈顶元素
	return true;
}
void PostOrder(BiTree T){
	BiTree p = T;
	BiTree r = NULL;//r指向最近访问的结点
	InitStack(S);
	while(p!=NULL || IsEmpty(S)){
		if(p){
			Push(S,p);
			p = p->lchild;
		}
		else{
			GetTop(S,p);
			if(p->rchild!=NULL && p->rchild!=r){//p有右孩子且没访问过
				p = p->rchild;
				Push(S,p);
				p = p->lchild;	
			}
			else{
				pop(S,p);
				visit(p);
				r = p;
				p = NULL;//p重置为null进入下一次循环
			}
		}
	}
	return ;
}

5.层序遍历

  1. 根节点入队;