C++ 二叉树(三叉链表存储)不使用栈的非递归算法

本文介绍了一种不使用栈的非递归算法来构造二叉树的方法,并通过先根序列实现。同时,还提供了一个不使用栈进行深拷贝的算法实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目.

二叉树(三叉链表存储)

      二叉树的成员函数,不使用栈的非递归算法(迭代)

          1.BinaryTree(T prelist[], int n)以标明空子树的先根序列构造二叉树(不使用栈的非递归算法)

          2.BinaryTree(BinaryTree<T> &bitree)深拷贝,不使用栈的非递归算法。



template <class T>
class Node                                           
{
  public:
    T data;                                              
    Node<T> *left,*right,*parent;            




   Node(T data, Node<T> *parent=NULL,Node<T> *left=NULL, Node<T> *right=NULL)
    {
        this->data = data;
this->parent = parent;
        this->left = left;
        this->right = right;
    }
    bool isLeaf()
    {
        return this->left==NULL && this->right==NULL;
    }
};



template <class T>

BinaryTree<T>::BinaryTree(T prelist[], int n)          //BinaryTree(T prelist[], int n)以标明空子树的先根序列构造二叉树(不使用栈的非递归算法)

{

int i;

 

Node<T> *p = NULL;

 

this->root = new Node<T>(prelist[0]);

p = this->root;

for( i = 1; i < n ;i++)

{

while(p->right!=NULL)

p=p->parent;

if( prelist[i] != NULL)

{

if( prelist[i-1]== NULL)

{

p = new Node<T>(prelist[i],p);

p->parent->right = p;

}

else

{

p = new Node<T>(prelist[i],p);

p->parent->left = p;

}

}

else if(prelist[i-1] == NULL &&  prelist[i] == NULL )

p = p->parent;

}

}

 

template<class T>

BinaryTree<T>::BinaryTree( BinaryTree<T> &bitree )////10-16  BinaryTree(BinaryTree<T> &bitree)深拷贝,不使用栈的非递归算法。

{

Node<T> *p = bitree.root; 

Node<T> *q = NULL;


this->root = new Node<T>( p->data );

q = this->root;

while(p != NULL)

{

while( p->left != NULL && q->left == NULL )

{

p = p->left;

q = new Node<T>(p->data,q);

q->parent->left=q;

}

if( p->right != NULL && q->right == NULL )

{

p = p->right;

q = new Node<T>(p->data,q);

q->parent->right = q;

}

else

{

while(p->parent != NULL && p->parent->right == p)

{

p = p->parent;

q = q->parent;

}

p = p->parent;

q = q->parent;

 

}

}

 

}


一个在努力中的未来程序员,如果有更好的算法,欢迎评论。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值