二叉树算法
day31
1.已知一颗二叉树,按照顺序存储结构进行存储,设计一个算法,求编号分别i和j的两个节点的最近的公共祖先结点的值。
思想:
祖先结点的下标为(i>j / j>i)i/2或者j/2
已知一个祖先结点,其儿子结点的下标为i*2
typedef ElemType int;
ElemType Search_Common_Ancester(int A[], int i,int j){
if(A[i] != NULL && A[j] != NULL){
//设置起始条件
while(i != j){
if(i > j){
i = i/2;//进行寻找祖先
}else{
j = j/2;//进行交换
}
}
//这里退出了循环,因此有i=j
return A[i];//返回结果
}
}
二叉树中序遍历-----非递归实现
口诀:入栈向左一直走 出栈访问右子树
算法思路:
1.初始化一个数据结构栈
2.对于从根节点开始,依次入栈左子树的左节点,直到结点为NULL,
3.同时对其进行栈顶元素的出栈
4.出栈之前要先判断右子树是否存在
5.右子树存在则入栈
6.不存在则出栈并访问。
typedef struct TNode{
ElemType data;
struct TNode* lchild, *rchild;
}TNODE;
//中序遍历
void MiddleTraverse(Tree root){
InitStack(S);
root = p;
//起始条件
while(p != NULL || !isEmpty(S)){
if