复制二叉树的非递归算法.算法思想和算法实现.

二叉链表表示的二叉树,复制二叉树的非递归算法。算法思想和算法实现。

这个题目 求个代码。。

void Main()
{
BNode node = new BNode(){
value = "1",
lNode = new BNode(){
value = "1-1"
},
rNode = new BNode(){
value = "1-2",
lNode = new BNode() {
value = "1-2-1",
rNode = new BNode() {
value = "1-2-1-2"
}
},
rNode = new BNode() {
value = "1-2-2"
}
}
};

BNode clone = Clone(node); 
}

BNode Clone(BNode source) {
Stack<BNode> stack = new Stack<BNode>();
stack.Push(source);

BNode dest = new BNode();
Stack<BNode> stackDest = new Stack<BNode>();
stackDest.Push(dest);
while (stack.Count>0) {
//复制节点的值
BNode s = stack.Peek();
BNode d = stackDest.Peek();
d.value = s.value;

if (s.lNode != null) { //寻找左子树 作为下一个结点
stack.Push(s.lNode);
d.lNode = new BNode();
stackDest.Push(d.lNode);
} else if (s.rNode != null) { //没有就找右子树
stack.Push(s.rNode);
d.rNode = new BNode();
stackDest.Push(d.rNode);
} else { //全没有 跳转到父结点的右子树
while (true) {
stack.Pop();
stackDest.Pop();
if (stack.Count <= 0) break;

BNode p = stack.Peek();
if (p.rNode == s) { //已经使用过右结点 向上继续回溯
s = p;
}
else if (p.rNode != null) {
stack.Push(p.rNode);
d = stackDest.Peek();
d.rNode = new BNode();
stackDest.Push(d.rNode);
break;

else s=p;
}
}
}
return dest;
}

// Define other methods and classes here
class BNode {
public object value;
public BNode lNode;
public BNode rNode;
}


算法思想的话就是构建两个栈用于回溯父结点...

其实递归算法隐藏了栈而已... 手动把这个栈构建出来就算成功了...

以上是一段C#代码示例   java代码应该复制粘贴就能用  C或者C++的话把BNode写成指针就可以使用...

温馨提示:内容为网友见解,仅供参考
第1个回答  2018-05-04
Status CopyBiTree(BiTree &dest, BiTree &sour,const int size)
{//层次遍历二叉树的同时对二叉树进行复制

if (!sour)//空树
{
dest = NULL;
}
else
{
Queue *Q;
BiTreeNode** de = new BiTreeNode*[size];
if (!de)
{
exit(OVERFLOW);//内存溢出
}
int pde = 0;//指向待建立左子树根和右子树根的结点

dest->data = sour->data;
de[pde] = dest;//先对根结点的复制
InitQueue(Q);
Enqueue(Q, sour);
while (!IsQEmpty(Q))//当还没复制完
{
int i = 1;//指向生成的左子树根和右子树根应该放入的位置
                          //因为一个结点的孩子不会超过2个,所以这个值最大是2
BiTreeNode *p; 
Dequeue(Q, p);
if (p->Lchild)//放入左子树的同时复制左子树
{
Enqueue(Q, p->Lchild);//放入左子树
BiTreeNode *left = Buynode(p->Lchild->data);
de[pde]->Lchild = left;//建立左子树关系
de[pde + (i++)] = left;//尾插左子树
}
if (p->Rchild)
{
Enqueue(Q, p->Rchild);
BiTreeNode *right = Buynode(p->Rchild->data);
de[pde]->Rchild = right;
de[(pde++) + i] = right;//pde++到层次遍历的
                  //下一个结点
}
}
}
return OK;
}

算法的思想很简单,就是在对二叉树进行层次遍历的时候,对其进行复制。

遍历是必须的,因为要复制一棵二叉树,首先就是要对其进行遍历。

想象一下,在对源二叉树进行层次遍历的时候,要复制的二叉树也在进行层次遍历,当源二叉树遍历到某个结点时,要复制的二叉树上生成了相对应的结点,最终在遍历完源二叉树时,完成对要复制二叉树的复制。在层次遍历的时候,每个结点的左子树右子树的情况都是可以知道的,所以在相应复制的时候也能建立对应的左子树右子树。

算法仅供参考,未必优秀,不过想的时候,千万不要想复杂了,发散地想,很快就可以想到的。

二叉树的深度算法怎么算啊
} 二、非递归实现基本思想:受后续遍历二叉树思想的启发,想到可以利用后续遍历的方法来求二叉树的深度,在每一次输出的地方替换成算栈S的大小,遍历结束后最大的栈S长度即是栈的深度。算法的执行步骤如下:(1)当树非空时,将指针p指向根节点,p为当前节点指针。(2)将p压入栈S中,0压入栈tag...

二叉树的遍历非递归算法中应注意哪些问题
方法1:访问T->data后,将T入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T,出栈,再先序遍历T的右子树。方法2:访问T->data后,将T->rchild入栈,遍历左子树;遍历完左子树返回时,栈顶元素应为T->rchild,出栈,遍历以该指针为根的子树。【算法1】void PreOrder(BiTree T, Statu...

跪求!!10分奉上!统计二叉树结点个数的算法 非递归
下面来看一下关于统计二叉树结点个数的非递归算法设计:1、将根结点插入队列。2、判断队列是否为空,非空执行第三步,否则执行第四步退出循环。3、从队列中取出一个结点,同时将取出结点的儿子结点插入队列。此外,将计数器加1,再转到第二步。4、结束循环。注意:队列是先进先出的结构,与栈相反。...

如何用非递归算法求二叉树的高度
return0;intfront=-1,rear=-1;//front出队指针 rear入队指针intlast=0,level=0;//last每一层的最右指针 (front==last时候一层遍历结束level++)BiTreeQ[Maxsize];//模拟队列Q[++rear]=T;BiTreep;while(front<rear){ p=Q[++front];//开始出队 因为front...

二叉树先序非递归遍历C语言算法
printf(" 先序遍历 非递归算法 输出二叉树所有结点内容:\\n "); while(B!=NULL||s->top>0) { if(B!=NULL) { printf("%c ", B->data); s->data[s->top++]=B; B=B->Lchild; } else { B=s->data[--s->top]; B=B->Rchild; } }}int main(void){ srand((unsigned)time(NULL));...

二叉树的层次遍历(非递归)可否借助栈来实现?
if (!StackEmpty(s)) \/\/通过下一次循环中的内嵌while实现右子树遍历 { p=pop(s);p=p->rchild;}\/\/endif }\/\/endwhile }\/\/PreOrderUnrec 2.中序遍历非递归算法 define maxsize 100 typedef struct { Bitree Elem[maxsize];int top;}SqStack;void InOrderUnrec(Bitree t){ SqStack s...

数据结构的中序遍历二叉树的结点的非递归算法
如图

...非递归遍历算法,层次序的非递归遍历算法的实现,应包含建树的实现_百 ...
\/\/二叉树前序遍历非递归实现 void preorder1(bintree t){ seqstack s;s.top=-1;\/\/top 的初始值为-1;while((t)||(s.top!=-1))\/\/当前处理的子树不为空或者栈不为空,则循环 { while(t){ cout<<t->data<<" ";\/\/访问当前子树根结点 s.top++;s.data[s.top]=t;t=t->lchild...

数据结构:二叉树的基础概念和算法
二叉树的创建与遍历,递归方法简洁高效,非递归实现则利用栈结构。中序遍历的非递归算法遵循左根右的顺序,通过栈结构实现。前序遍历的非递归实现通过指针和栈操作,确保根结点的优先输出。后序遍历的非递归实现较为复杂,通过栈和结点状态判断,确保根结点的最后输出。本文旨在总结二叉树的基础概念和算法,...

二叉树前序遍历法举例!急急急!!!
递归算法 算法描述:(1)若二叉树为空,结束 (2)后序遍历左子树 (3)后序遍历右子树 (4)访问根结点 伪代码 PROCEDURE POSTRAV(BT)IF BT<>0 THEN { POSTRAV(L(BT))POSTRAV(R(BT))OUTPUT V(BT)} RETURN c语言描述 struct btnode { int d;struct btnode *lchild;struct btnode *...

相似回答