数据结构之树的创建及非递归遍历

1,树的递归创建
创建树的类,先创建struct TreeNode的节点
对于 char* ch=”abd###ce##f”的字符串创建树,遇到#为空
2,特殊情况:记得对节点指针的有效性判断

template<class T>
struct TreeNode
{
    TreeNode()
    {}

    TreeNode(T value)
    {
        data = value;
        LeftTree = NULL;
        RightTree = NULL;
    }
    T data;
    TreeNode<T> *LeftTree;
    TreeNode<T> *RightTree;
};

template<class T>
class Tree
{
public:
    Tree()
        :_pRoot(NULL)
    {}

    Tree(T* arr, size_t size)
        :_pRoot(NULL)
    {
        size_t index = 0;
        CreatTree(_pRoot, arr, size, index);
    }

    Tree(const Tree<T>& p)
    {
        if (p._pRoot != NULL)
            _pRoot = CopyTree(p._pRoot);

    }
    Tree<T>& operator=(Tree<T>& p)
    {
        if (&p != this)
        {
            if (_pRoot != NULL)
            {
                Destory(_pRoot);
            }

            _pRoot = CopyTree(p._pRoot);

        }

        return  *this;
    }
    ~Tree()
    {
        if (_pRoot != NULL)

        {
            Destory(_pRoot);
        }
    }
    }
    void CreatTree(TreeNode<T> *& pRoot, T *arr, size_t size, size_t &index)
    {
        if (pRoot == NULL && index<size && arr[index] != '#')
        {
            pRoot = new TreeNode<T>(arr[index]);
            CreatTree(pRoot->LeftTree, arr, size, ++index);
            CreatTree(pRoot->RightTree, arr, size, ++index);
        }
    }
    TreeNode<T> *& CopyTree(TreeNode<T>* p)
    {
        TreeNode<T> * newpRoot;
        if (p != NULL)
        {
            newpRoot = new TreeNode<T>(p->data);
            newpRoot->LeftTree = CopyTree(p->LeftTree);
            newpRoot->RightTree = CopyTree(p->RightTree);
            return newpRoot;
        }

    }


    void Destory(TreeNode<T> *& pRoot)
    {

        if (pRoot != NULL)
        {
            Destory(pRoot->LeftTree);
            Destory(pRoot->RightTree);
            delete  pRoot;
            pRoot = NULL;

        }
    }

2树的非递归遍历

void RootFrontTree()
    {
        std::stack<TreeNode<T>*> s;
        TreeNode<T>*  pCur = _pRoot;
        s.push(pCur);
        while (!s.empty())
        {
            TreeNode<T>* newTop = s.top();
            cout << newTop->data;
            s.pop();
            if (newTop->RightTree != NULL)
                s.push(newTop->RightTree);
            if (newTop->LeftTree != NULL)
                s.push(newTop->LeftTree);

        }

    }

    void RootMidTree()
    {
        std::stack<TreeNode<T>*> s;
        TreeNode<T>*  pCur = _pRoot;
        while (!s.empty() || pCur != NULL)  //当把根的左子树遍历完,根节点也pop出来时,栈可能为空
        {
            while (pCur)          //找到最左边的:最左边的没左子树
            {
                s.push(pCur);
                pCur = pCur->LeftTree;

            }
            TreeNode<T>* newTop = s.top();
            if (newTop->RightTree == NULL)
            {
                cout << newTop->data;
                s.pop();
            }
            else
            {
                cout << newTop->data;
                pCur = newTop->RightTree;
                s.pop();
            }

        }

    }

    void RootBackTree()
    {
        std::stack<TreeNode<T>*> s;
        TreeNode<T>*  pCur = _pRoot;
        TreeNode<T>* per = NULL;
        while (!s.empty() || pCur != NULL) //刚进时为空
        {
            while (pCur)          //找到最左边的:最左边的没左子树
            {
                s.push(pCur);
                pCur = pCur->LeftTree;

            }
            TreeNode<T>* newTop = s.top();
            if (newTop->RightTree == NULL || per == newTop->RightTree)//打印1.没右子树 2.有右子树,但已经刚被打印过了
            {

                cout << newTop->data;
                per = newTop;
                s.pop();
            }

            else
            {
                pCur = newTop->RightTree;

            }

        }
    }
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉树创建可以通过动态内存分配来实现,具体步骤如下: 1. 定义二叉树结构体,包括数据域和左右子树指针。 2. 申请内存空间,将数据域和左右子树指针初始化为空。 3. 递归创建左右子树。 以下是C语言二叉树创建代码示例: ```c #include <stdio.h> #include <stdlib.h> typedef struct TreeNode { int data; struct TreeNode *left; struct TreeNode *right; } TreeNode; TreeNode* createTree() { int val; scanf("%d", &val); if (val == -1) { // -1表示空节点 return NULL; } TreeNode *node = (TreeNode*)malloc(sizeof(TreeNode)); node->data = val; node->left = createTree(); node->right = createTree(); return node; } ``` 非递归前序遍历二叉树的方法是使用栈来模拟递归过程,具体步骤如下: 1. 将根节点入栈。 2. 取出栈顶元素,访问该节点。 3. 如果该节点有右子树,将右子树入栈。 4. 如果该节点有左子树,将左子树入栈。 5. 重复步骤2-4,直到栈为空。 以下是C语言二叉树非递归前序遍历代码示例: ```c void preOrder(TreeNode *root) { if (root == NULL) { return; } TreeNode *stack[100]; int top = -1; stack[++top] = root; while (top >= 0) { TreeNode *node = stack[top--]; printf("%d ", node->data); if (node->right != NULL) { stack[++top] = node->right; } if (node->left != NULL) { stack[++top] = node->left; } } } ``` 非递归中序遍历二叉树的方法也是使用栈来模拟递归过程,具体步骤如下: 1. 将根节点入栈。 2. 如果当前节点有左子树,将左子树入栈。 3. 如果当前节点没有左子树,取出栈顶元素,访问该节点,如果该节点有右子树,将右子树入栈。 4. 重复步骤2-3,直到栈为空。 以下是C语言二叉树非递归中序遍历代码示例: ```c void inOrder(TreeNode *root) { if (root == NULL) { return; } TreeNode *stack[100]; int top = -1; TreeNode *node = root; while (node != NULL || top >= 0) { while (node != NULL) { stack[++top] = node; node = node->left; } node = stack[top--]; printf("%d ", node->data); node = node->right; } } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值