一个二叉树程序

暂时只实现了插入和清空操作,后续其他操作会继续实现
#include<iostream>
using namespace std;
#include<iomanip>
template <class T>
class bTree
{
public:
    struct node{
        T data;
        node* left;
        node* right;
        node(const T data = T()):data(data),left(NULL),right(NULL){}
    };
    typedef node* Node;
    bTree():tree(NULL),size(0){}
    ~bTree();
    void update(const T& oldData,const T& newData)
    {
        if(remove(oldData))
        {
            insert(newData);
        }
    }
    void insert(const T&);
    void insert(node* &temp,const T&);
    void insert(node* &temp,node* &temp1)
    {
         if(temp==NULL)
        {
            temp = new node();
            temp = temp1;
            ++size;
        }else{
           if(temp1->data > (temp->data))
           {
               insert(temp->right,temp1);
           }else{
               insert(temp->left,temp1);
           }
        }
    }
    //template <class T>
    bool remove(const T& data)
    {
        Node &nodp = find(data);
        if(nodp==NULL)
        {
            return false;
        }
        node* temp = nodp;
        //cout<<temp->data<<endl;
        temp = nodp;
        if(nodp->left!=NULL)
        {
            //cout<<"Insert"<<endl;
            insert(nodp->right,nodp->left);
        }
          //cout<<"Insert complete!!"<<endl;
        nodp = nodp->right;
        delete temp;
        //cout<<temp->data<<endl;
        --size;
        return true;
    }
    void show();
    void show(node* &temp);
    void clear();
    void clear(node* &temp);
    int getSize()const { return size;}
    T getData(const T&);
    T getData(node* &temp,const T&);
    //template <class T>
    Node& find(node* &temp,const T& data)
    {
         if(temp!=NULL)
        {
            if(temp->data > data)
            {
                return find(temp->left,data);
            }

            if(temp->data < data){
                return find(temp->right,data);
            }

            return temp;
        }
    }
    //template <class T>
    Node& find(const T& data)
    {
        return find(tree,data);
    }

    void print(node* &temp, int space, char sign){
		if(temp==NULL) return;
		print(temp->right,space+3,'/');
		cout << setw(space+1) << sign << temp->data << endl;
		print(temp->left,space+3,'\\');
	}
	void print(){ print(tree,0,'*');cout<<"---------"<<endl; }

private:
    node* tree;
    int size;
};

template <class T>
bTree<T>::~bTree()
{
    clear();
}
template <class T>
void bTree<T>::insert(const T& data)
{
    insert(tree,data);
}

template <class T>
void bTree<T>::insert(node* &temp,const T& data)
{
    if(temp==NULL)
    {
        temp = new node();
        temp->data = data;
        ++size;
    }else{
       if(data > (temp->data))
       {
           insert(temp->right,data);
       }else{
           insert(temp->left,data);
       }
    }
}

template <class T>
void bTree<T>::show()
{
    //cout<<"show"<<endl;
    show(tree);
}
template <class T>
void bTree<T>::show(node* &temp)
{
    if(temp==NULL)
    {
        //cout<<"show null"<<endl;
        return;
    }else{
        show(temp->left);
        cout<<temp->data<<endl;
        show(temp->right);
    }
}

template <class T>
void bTree<T>::clear()
{
    clear(tree);
}
template <class T>
void bTree<T>::clear(node* &temp)
{
    if(temp!=NULL)
    {
        clear(temp->left);
        delete temp;
        clear(temp->right);
        --size;
    }
}
template <class T>
T bTree<T>::getData(const T& data)
{
    return find(data)->data;
}

template <class T>
T bTree<T>::getData(node* &temp,const T& data)
{
    return find(temp,data)->data;
}

int main(int argc,char** argv)
{
    bTree<int> test;
    test.insert(30);
    test.insert(10);
    test.insert(15);
    test.insert(5);
    test.insert(40);
    test.insert(45);
    test.insert(1);
    test.insert(3);
    test.insert(6);
    test.insert(7);
    test.print();

    cout<<"get data="<<test.getData(40)<<endl;
    test.remove(10);
    test.print();

    test.update(40,55);
    test.print();
    return 0;
}



 


 

线索二叉树是一种特殊的二叉树,它在节点的左右子树指针上添加了线索。线索指向的是该节点在中序遍历中的前驱或后继节点。以下是一个简单的线索二叉树的Java程序示例: ``` class Node { int data; Node left, right; boolean leftThread, rightThread; public Node(int value) { data = value; left = right = null; leftThread = rightThread = false; } } public class ThreadedBinaryTree { Node root; public ThreadedBinaryTree() { root = null; } // 中序遍历线索化二叉树 public void inOrderThread() { if (root == null) return; Node cur = root; Node prev = null; while (cur != null) { while (!cur.leftThread && cur.left != null) { cur = cur.left; } if (cur.left == null) { cur.leftThread = true; cur.left = prev; } if (prev != null && prev.right == null) { prev.rightThread = true; prev.right = cur; } prev = cur; cur = cur.right; } } // 中序遍历线索二叉树 public void inOrderTraversal() { if (root == null) return; Node cur = root; while (cur.left != null) { cur = cur.left; } while (cur != null) { System.out.print(cur.data + " "); if (cur.rightThread) { cur = cur.right; } else { cur = cur.right; while (cur != null && !cur.leftThread) { cur = cur.left; } } } System.out.println(); } public static void main(String[] args) { ThreadedBinaryTree tree = new ThreadedBinaryTree(); tree.root = new Node(1); tree.root.left = new Node(2); tree.root.right = new Node(3); tree.root.left.left = new Node(4); tree.root.left.right = new Node(5); tree.root.right.left = new Node(6); tree.root.right.right = new Node(7); tree.inOrderThread(); tree.inOrderTraversal(); } } ``` 在上述程序中,我们定义了一个`Node`类来表示二叉树的节点。每个节点包含数据、左右子树指针和左右线索指针。我们还定义了一个`ThreadedBinaryTree`类来表示线索二叉树。该类包含一个根节点和两个方法:`inOrderThread()`和`inOrderTraversal()`。`inOrderThread()`方法用于将二叉树线索化,即在每个节点的左右子树指针上添加线索。该方法使用中序遍历的方式将二叉树遍历,并在遍历过程中添加线索。`inOrderTraversal()`方法用于中序遍历线索二叉树,并输出每个节点的数据。 在`main()`方法中,我们创建了一个示例二叉树,并调用`inOrderThread()`方法将其线索化。然后,我们调用`inOrderTraversal()`方法中序遍历线索二叉树,并输出每个节点的数据。输出结果应该为:`4 2 5 1 6 3 7`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值