有关二叉树的部分操作

struct TreeNode{
    ElemtType val;
    TreeNode *left,*right;
};

1.判定一棵二叉树是否是完全二叉树

借助于层次遍历的算法,将所有结点入队列,包括空结点。出队遇到空结点时,查看其后是否有非空结点,若有,则不是完全二叉树。

bool isComplete(TreeNode* root){
        TreeNode* Q[MaxSize];
        int front = -1, rear = -1;
        if (!root)
            return true;
        Q[++rear] = root;
        while (front != rear){
            root = Q[++front];
            if (root){
                Q[++rear] = root->left;
                Q[++rear] = root->right;
            }
            else{
                while (front != rear){
                    root = Q[++front];
                    if (root)
                        return false;
                }
            }
        }
        return true;
    }

2.求先序遍历序列中第K(1<=k <= n)个结点的值。

设置一个引用变量i记录已经访问过的结点的序号,初值设为0。当前二叉树b为空时返回一个特殊字符’#’。当i==k,表示找到满足条件的结点;当i!=k时,则递归地在左子树中查找,若找到返回该值,否则继续递归地在右子树中查找。

ElemType getK(TreeNode* root, int& n,int k){
        if (!root)
            return ‘#‘;
        n++;
        if (n == k)
            return root->val;
        ElemType temp=getK(root->left, n, k);
        if (temp != ‘#‘)
            return temp;
        return getK(root->right, n,k);
    }

3.对于二叉树中每一个元素为x的结点,删去以它为根的子树,并释放相应的空间。

删除以元素值x为根的子树,只要能删除其左、右子树,就可以释放值为x的根节点。在后序遍历的基础上进行删除某一结点的左右子树,并将该结点的左右指针设为NULL。

需要注意的是参数为引用值。

void Delete(TreeNode*& root){
        if (root){
            Delete(root->left);
            Delete(root->right);
            delete root;
            root = NULL;
        }
    }

    void DeleteX(TreeNode*& root, int x){
        if (!root)
            return;
        DeleteX(root->left, x);
        DeleteX(root->right, x);
        if (root->val == x)
            Delete(root);
    }

4.在二叉树中查找值为x的结点,打印该结点的所有祖先。假设值为x的结点不多于1个。

采用后序遍历,最后访问根节点,当访问到值为x的结点时,栈中所有元素均为该结点的祖先。

void printFore(TreeNode* root, ElemType x){
        Stack s[MaxSize];
        int top = 0;
        while (root || top != 0){
            while (root&&root->val != x){
                s[++top].t = root;
                s[top].tag = 0;
                root = root->left;
            }
            if (root&&root->val == x){
                for (int i = 1; i <= top; i++){
                    cout << s[top].t->val << " ";
                }
                cout << endl;
                return;
            }
            while (top != 0 && s[top].tag == 1)
                top--;
            if (top != 0){
                s[top].tag = 1;
                root = s[top].t->right;
            }
        }
    }
时间: 2024-11-15 01:26:21

有关二叉树的部分操作的相关文章

二叉树的相关操作

#include<stdio.h> #include<malloc.h> #define MAXSIZE 20 typedef char TEelemtype; typedef struct BiTNode{ TEelemtype data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; //队列的方式 typedef struct queueelem { BiTNode* b[MAXSIZE]; int front,rear;

二叉树各种相关操作(建立二叉树、前序、中序、后序、求二叉树的深度、查找二叉树节点,层次遍历二叉树等)(C语言版)

将二叉树相关的操作集中在一个实例里,有助于理解有关二叉树的相关操作: 1.定义树的结构体: 1 typedef struct TreeNode{ 2 int data; 3 struct TreeNode *left; 4 struct TreeNode *right; 5 }TreeNode; 2.创建根节点: 1 TreeNode *creatRoot(){ 2 TreeNode * root =(TreeNode *)malloc(sizeof(TreeNode)); 3 if(NULL=

java实现二叉树的常见操作

本文转自:红客联盟 解释:程序调用自身的编程技巧叫做递归. 程序调用自身的编程技巧称为递归( recursion).递归做为一种算法在程序设计语言中广泛应用. 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量.递归的能力在于用有限的语句来定义对象的无限集合. 递归的三个条件: 边界条件 递归前进段 递归返回段 当边界条件不

二叉树的简单操作

#define _CRT_SECURE_NO_WARNINGS #define m 100 typedef char DataType; typedef struct Node /*二叉链表的结构体*/ { DataType data; struct Node * LChild; struct Node * RChild; }BiTNode, *BiTree; #define Queue_Size 100 typedef BiTree QueueElement; typedef struct /

数据结构开发(24):二叉树中属性操作、层次遍历与典型遍历

0.目录 1.二叉树中属性操作的实现 2.二叉树结构的层次遍历 3.二叉树的典型遍历方式 4.小结 1.二叉树中属性操作的实现 二叉树的属性操作: 二叉树中结点的数目: 定义功能:count(node) 在 node 为根结点的二叉树中统计结点数目 在BTree.h中实现统计结点数目: protected: int count(BTreeNode<T>* node) const { int ret = 0; if( node != NULL ) { ret = count(node->l

数据结构开发(25):二叉树中属性操作、层次遍历与典型遍历

0.目录 1.二叉树的比较与相加 2.二叉树的线索化实现 3.二叉树的经典面试题分析 3.1 单度结点删除 3.2 中序线索化二叉树 4.小结 1.二叉树的比较与相加 二叉树的克隆操作: SharedPointer< BTree<T> > clone() const 克隆当前树的一份拷贝 返回值为堆空间中的一棵新二叉树 ( 与当前树相等 ) 二叉树的克隆: 定义功能:clone(node) 拷贝 node 为根结点的二叉树 ( 数据元素在对应位置相等 ) 在BTree.h中实现二叉

二叉树的其他操作

之前实现过二叉树的创建,非递归遍历和递归遍历.现在添加一些其他的操作,包括: 销毁一棵树 计算树的深度(高度) .计算叶子节点的个数 计算所有节点的个数 复制二叉树 具体见代码: #include <stdio.h> #include <stdlib.h> typedef struct Node {     int data;     struct Node* lchild;     struct Node* rchild; }Node; //创建树 Node* create_tr

二叉树的一系列操作

//二叉树学习过程中的问题和代码集合//按先序序列创建二叉树//树的高度//求树的结点数//求二叉树第K层的节点个数//求二叉树中叶子节点的个数//求二叉树中节点的最大距离//两结点最低公共祖先//判断二叉树是不是平衡二叉树//释放树空间 //感谢:http://blog.csdn.net/luckyxiaoqiang/article/details/7518888#topic1 #include<iostream> #include<stack> #include<queu

第六十五课 二叉树中属性操作的实现

递归功能函数: 1 int count(BTreeNode<T>* node) const 2 { 3 return (node != NULL) ? (count(node->left) + count(node->right) + 1) : 0; 4 } 功能函数如下: 1 int height(BTreeNode<T>* node) const 2 { 3 int ret = 0; 4 5 if( node != NULL ) 6 { 7 int lh = hei