标签:
1.要理解回溯就必须清楚递归的定义和过程。
递归算法的非递归形式可采用回溯算法。主要考虑的问题在于:
2.贴代码表现:
先序遍历二叉树:
BTNode *FindNode(BTNode *b,ElementType x) { //在二叉树中查找值为x的结点 BTNode *p; if (b==NULL) return NULL; else if (b->Element==x) return b; else { p=FindNode(b->Left,x); if (p!=NULL) return p; else return FindNode(b->Right,x); } } void prev(BTNode *b) { BTNode *f=b; int i,j; U[0]=‘|‘; i=1; for(;;) { for(;;) { j=0; printf("%c",f->Element); switch(pd(f)) { case 0: { //当一个节点为叶子结点的时候开始回溯 j=1;break; } case 1:{ f=f->Left;break; //当一个节点有左孩子无右孩子的时候访问左孩子 } case 2:{ f=f->Right;break; //当一个节点有右孩子无左孩子的时候访问右孩子 } case 3:{ U[i++]=f->Element; //当一个节点有左孩子又有右孩子时存入节点的值 f=f->Left;break; //至字符数组U,以便以后回溯访问上一级。与此同时继续访问左孩子 } } if(j==1) break; } f=FindNode(b,U[i-1]); //根据U中最近保存的字符找出在原二叉树中相应的结点 if(--i==0) break; f=f->Right; //此时,应该访问回溯节点的右节点 //弹栈操作 } }
标签:
原文地址:http://www.cnblogs.com/akiradunn/p/5002105.html