分别求二叉树前、中、后序的第k个节点

一、求二叉树的前序遍历中的第k个节点

//求先序遍历中的第k个节点的值
int n=1;
elemType preNode(BTNode *root,int k){
    if(root==NULL)
        return ‘ ‘;
    if(n==k)
        return root->data;
    n++;
    elemType ch = preNode(root->lchild,k);
    if(ch!=‘ ‘)
        return ch;
    ch = preNode(root->rchild,k);
    return ch;
}
//求先序遍历中的第k个节点的值(非递归)
elemType preNode2(BTNode *root,int k){
    if(root!=NULL){
        int n=0;
        stack<BTNode*> s;
        BTNode *p=root;
        s.push(p);
        while(!s.empty()){
            p=s.top();
            s.pop();
            n++;
            if(n==k){
                //printf("%c ",p->data);
                return p->data;
            }
            if(p->rchild!=NULL)
                s.push(p->rchild);
            if(p->lchild!=NULL)
                s.push(p->lchild);
        }
    }else
        return ‘ ‘;
}

二、求二叉树的中序遍历中的第k个节点

//求中序遍历中的第k个节点的值
elemType inNode(BTNode *root,int k){
    if(root==NULL)
        return ‘ ‘;
    stack<BTNode*> s;
    BTNode *p=root;
    int n=0;
    while(!s.empty()||p){
        while(p){
            s.push(p);
            p=p->lchild;
        }
        if(!s.empty()){
            p=s.top();
            s.pop();
            n++;
            if(n==k)
                return p->data;
            p=p->rchild;
        }
    }
} 

三、求二叉树的后序遍历中的第k个节点

//求后序遍历中的第k个节点的值
elemType postNode(BTNode *root,int k){
    BTNode* stack[100];
    int top=-1;
    int f=1;
    int n=0;
    BTNode *b=NULL;
    if(root!=NULL){
        BTNode *p=root;
        do{
            while(p){
                stack[++top]=p;
                p=p->lchild;
            }
            f=1;
            b=NULL;
            while(top>-1&&f){
                p=stack[top];
                if(p->rchild==b){
                    n++;
                    if(n==k)
                        return p->data;
                    b=p;
                    top--;
                }else{
                    p=p->rchild;
                    f=0;
                }
            }
        }while(top>-1);
    }
} 

原文地址:https://www.cnblogs.com/hekuiFlye/p/9574342.html

时间: 2024-10-03 21:53:40

分别求二叉树前、中、后序的第k个节点的相关文章

飘逸的python - 极简的二叉树前中后序通杀函数

对于任一结点,可以按某种次序执行三个操作: 访问结点本身(N) 遍历该结点的左子树(L) 遍历该结点的右子树(R) 用来表示顺序,即,前序NLR/中序LNR/后序LRN. 下面我们用namedtuple来表达树,而通杀的遍历函数带一个order参数,只要我们把指定顺序传进去即可实现对应的遍历. #coding=utf-8 ''' 1 / / / 2 3 / \ / 4 5 6 / / 7 8 9 ''' from collections import namedtuple from sys im

二叉树前中后序遍历递归转循环

通过观察递归实现,用循环和栈模拟递归实现中结点入栈和出栈的过程. #include <bits/stdc++.h> #define DBG(x) cerr << #x << " = " << x << endl using namespace std; typedef long long LL; struct Node { int val; Node *left, *right; Node() : left(NULL), ri

二叉树前中后序遍历非递归实现

package MyExc; import java.util.Stack; class TreeNode{ int data; TreeNode left; TreeNode right; } public class BinaryTree { public void preOrder(TreeNode head){ Stack<TreeNode> stack = new Stack<>(); stack.add(head); while(!stack.isEmpty()){ h

二叉树的前中后序遍历简单的递归

二叉树的遍历 无外乎广度和深度 其中深度又分为前中后序遍历三种情况  这三种遍历若只是递归方法 自然很是简单 但递归代码简单 若嵌套层次太深 会栈溢出 二叉树节点数据结构: struct Binary_node{    int val;    Binary_node *left;    Binary_node *right;    Binary_node(int v = 0, Binary_node *le = nullptr, Binary_node *ri = nullptr) :val(v

非递归前中后序遍历二叉树

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 写在前面: 最近准备找工作,捡起原来学习过的各种知识,加上一些自己的理解,梳理一下流程,巩固自己的认识,一步两步,一步两步... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 二叉树的遍历是树操作的基础,一般的前中后序递归遍历比较简单,这里就不列出了,主要是非递归实

二叉树的前序建立,前中后序遍历的非递归算法

二叉树的前序建立递归算法以及前中后序遍历的递归算法已经是人尽皆知了,递归算法也确实为代码的编写带来了很大的方便.然而,有时我们也确实需要它们的非递归算法.将递归算法转化为非递归算法可以帮助我们深入了解函数的调用与栈的原理.这里总结一下二叉树的这些重要的非递归算法. 一.前序建树 前序建树的基本思路是,接收用户输入的一组字符串,其中'#'代表空树,其他代表树结点的数据域值.例如,要建立如下一棵树 需要输入"AB#D##C##". 而非递归的思路是,1.设一个标志位来判断当前创建的结点是左

关于前中后序排列

大致可以总结如下: 前序排列(preorder):根左右 中序排列(inorder):左根右 后续排序(postorder):左右根 重点看"根"的位置,在最前面就是前序,中间就是中序,后面就是后序.补充一点,上述排列都是DFT(深度优先排列,Depth First Traversals).另有Breadth First or Level Order Traversal . 详解 首先上个例子: 中序是左根右,所以从最左的左节点4开始(其他的还不够"左",例如2,其

前中后序建立树或者直接历遍

前中后序建立树或者直接历遍 代码实现 void postOrder(int root,int start,int end) { if (start > end) return; int index = start; while (inOrder[index] != preOrder[root] ) index++; postOrder(root + 1, start, index - 1); postOrder(root + index - start + 1, index + 1, end);

二叉树的建立及其前中后序遍历

1 //二叉树存储结构: 2 struct node 3 { 4 Int data; 5 node *lchild; 6 node *rchild; 7 }; 8 9 //二叉树在建树前根节点不存在: 10 Node *root = NULL; 11 12 //新建结点: 13 node *newNode(int v) 14 { 15 node *Node = new node; 16 Node->data = v; 17 Node->lchild = NULL; 18 Node->rc