二叉树的遍历C/C++

二叉树建立

一:二叉排序树的左子树节点值都小于根节点值,右子树节点值都大于根节点,因此假如根节点值为10,其左节点值为5,其左节点的右节点值为8,那么从右节点到跟节点的值依次为8 5 10,显然不是有序的
二:哈夫曼树是带权路径最小的二叉树,也不是有序的
三:AVL树是二叉排序树,只不过其左右子树的高度差有限制,每一个节点的左子树和右子树的高度差的绝对值至多等于1
四:堆是一种完全二叉树,其有大顶堆和小顶堆的分别,大顶堆是指其每个节点的值都大于其左右孩子的值(小顶堆反之),因此从任一节点到根节点是升序排列的(小顶堆反之)

//前序,建立二叉树
//前序,建立二叉树
struct TreeNode
{
	int val;
    TreeNode *left;
    TreeNode *right;
};

void CreateBitree(TreeNode* &T)
{
    int tmp;
    cin>>tmp;
    
    if(tmp == 655535) {
        T = NULL;
    } else {
        T = new TreeNode;
        T->val = tmp;
        CreateBitree(T->left);
        CreateBitree(T->right);
    }
}

二叉树前序遍历

typedef struct BTNode_s {
    int value;
    BTNode_s* pLeft;
    BTNode_s* pRight;
} BTNode;

非递归

void PreOrder(BTNode *pRoot)
{
    if (pRoot == nullptr) return;

    BTNode* p = pRoot;
    std::stack<BTNode*> treeStack;

    while(p != nullptr || !treeStack.empty()) {
        while(p != nullptr) {
            printf("%d\t", p->value);
            treeStack.push(p);
            p= p->pLeft; 
        }

        if (!treeStack.empty()) {
            p = treeStack.top();
            treeStack.pop();
            p = p->pRight;
        }
    }
}

递归

void PreOrder(BTNode* T)
{
    if(T == NULL) return;

    printf("%d", T->val);   //显示结点数据,可以更改为其他对节点操作
    PreOrder(T->pLeft);     //再先序遍历左子树
    PreOrder(T->pRight);    //最后先序遍历右子树       
}

二叉树中序遍历

typedef struct BTNode_s {
    int value;
    BTNode_s* pLeft;
    BTNode_s* pRight;
} BTNode;

非递归

void InOrder(BTNode* pRoot)
{
    if(pRoot ==NULL)  return;

    BTNode* p = pRoot;
    std::stack<BTNode*> treeStack;

    while(p != nullptr || !treeStack.empty()) {
        while(p != nullptr) {
            treeStack.push(p);
            p= p->pLeft;
        }

        if(!treeStack.empty()) {
            p= treeStack.top();
            printf("%d\t", p->value);
            treeStack.pop();
            p= p->pRight;
        }
    }
}

递归

void InOrder(BTNode* T)
{
    if(T == NULL)   return;

    InOrder(T->pLeft);      //中序遍历左子树
    printf("%d", T->val);   //显示结点数据,可以更改为其他对节点操作
    InOrder(T->pRight);     //最后中序遍历右子树       
}

二叉树后序遍历

typedef struct BTNode_s {
    int value;
    BTNode_s* pLeft;
    BTNode_s* pRight;
} BTNode;

非递归

void PostOrder(BTNode* pRoot)
{
    if(pRoot == nullptr) return;

    std::stack<BTNode*> treeStack;
    std::stack<int> nodeState;
    BTNode* p = pRoot;

    while(p != nullptr) {
        treeStack.push(p);
        nodeState.push(0);
        p = p->pLeft;
    }

    while(!treeStack.empty()) {
        p = treeStack.top();

        while(p->pRight != nullptr && nodeState.top() == 0) {
            nodeState.pop();
            nodeState.push(1);
            p = p->pRight;

            while(p != nullptr) {
                treeStack.push(p);
                nodeState.push(0);
                p = p->pLeft;
            }
            p = treeStack.top();
        }

        printf("%d\t", p->value);
        treeStack.pop();
        nodeState.pop();
    }  
}

递归

void PostOrder(BTNode* )
{
    if(T == NULL)   return;
    PostOrder(T->pLeft);    //先后序遍历左子树  
    PostOrder(T->pRight);   //再后序遍历右子树
    printf("%d", T->val);   //显示结点数据,可以更改为其他对节点操作       
}

层序遍历

struct TreeNode 
{
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x): val(x), left(NULL), right(NULL) {}
};

vector<int> PrintFromTopToBottom(TreeNode* root) 
{
    vector<int> res;
    if(root == nullptr) return res;
    
    queue<TreeNode*> q;
    q.push(root);
    
    while(!q.empty()) {
        res.push_back(q.front()->val);
        if(q.front()->left) q.push(q.front()->left);
        if(q.front()->right) q.push(q.front()->right);
        q.pop();
    }
    return res;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
二叉树是一种常见的数据结构遍历二叉树有多种方法,包括先序遍历、中序遍历和后序遍历。以下是在C语言中用数组表示二叉树并进行遍历的示例代码: ```c #include <stdio.h> // 定义二叉树节点结构 struct TreeNode { int data; struct TreeNode *left; struct TreeNode *right; }; // 构建二叉树 struct TreeNode nodes[10]; // 使用数组表示二叉树 void buildTree() { for (int i = 0; i < 10; i++) { nodes[i].data = i; nodes[i].left = NULL; nodes[i].right = NULL; } nodes[0].left = &nodes[1]; nodes[0].right = &nodes[2]; nodes[1].left = &nodes[3]; nodes[1].right = &nodes[4]; nodes[2].left = &nodes[5]; nodes[2].right = &nodes[6]; } // 先序遍历 void preOrder(struct TreeNode *root) { if (root != NULL) { printf("%d ", root->data); preOrder(root->left); preOrder(root->right); } } // 中序遍历 void inOrder(struct TreeNode *root) { if (root != NULL) { inOrder(root->left); printf("%d ", root->data); inOrder(root->right); } } // 后序遍历 void postOrder(struct TreeNode *root) { if (root != NULL) { postOrder(root->left); postOrder(root->right); printf("%d ", root->data); } } int main() { buildTree(); printf("先序遍历结果:"); preOrder(&nodes[0]); printf("\n中序遍历结果:"); inOrder(&nodes[0]); printf("\n后序遍历结果:"); postOrder(&nodes[0]); return 0; } ``` 以上代码定义了一个二叉树的结构,使用数组表示节点,并实现了先序、中序和后序遍历的方法。在主函数中构建了一个二叉树,并进行了遍历操作,打印出遍历的结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值