二叉树操作——前序、中序、后序、层序

先上树
二叉树

一、前序、中序、后序、层序

#include <jni.h>
#include <string>
#include <android/log.h>
#include <queue>

#define JNI_TAG "JNI_TAG"
#define LOGE(...) __android_log_print(ANDROID_LOG_ERROR, JNI_TAG, __VA_ARGS__)

using namespace std;

template <class T>
class TreeNode {
public:
    T data;
    TreeNode* left = NULL;
    TreeNode* right = NULL;
public:
    TreeNode(T data) {
        this->data = data;
    }
};

//    void doPre(char data) {
//        LOGE("%c", data);
//    }
    
//    template <class T>
//    void preOrderTraverse(TreeNode<T> *node, void doPre(T)) {
//        if (node == NULL) {
//            return;
 //       }
    
//        doPre(node->data);
    
//        TreeNode<T> *left = node->left; // 这里使用了 left,在定义时需要定义为 NULL
//        preOrderTraverse(left, doPre);
//        TreeNode<T> *right = node->right;
//        preOrderTraverse(right, doPre);
//    }

template <class T>
void doPre(TreeNode<T> *node) {
    LOGE("%c", node->data);
}

// 前序遍历
template <class T>
void preOrderTraverse(TreeNode<T> *node, void doPre(TreeNode<T> *node)) {
    if (node == NULL) {
        return;
    }
    
    doPre(node);
    
    TreeNode<T> *left = node->left; // 这里使用了 left,在定义时需要定义为 NULL
    preOrderTraverse(left, doPre);
    TreeNode<T> *right = node->right;
    preOrderTraverse(right, doPre);
}

// 中序遍历
template <class T>
void inorderTraverse(TreeNode<T> *pNode, void (*visit)(T)) {
    if (pNode == NULL) {
        return;
    }

    inorderTraverse(pNode->left, visit);

    visit(pNode->data);

    inorderTraverse(pNode->right, visit);
}

// 后序遍历
template <class T>
void postOrderTraverse(TreeNode<T> *pNode, void (*visit)(T)) {
    if (pNode == NULL) {
        return;
    }

    postOrderTraverse(pNode->left, visit);

    postOrderTraverse(pNode->right, visit);

    visit(pNode->data);
}

// 层序遍历
template<class T>
void levelOrderTraverse(TreeNode<T> *pNode, void (*visit)(TreeNode<T> *)) {
    if (pNode == NULL) {
        return;
    }

    queue<TreeNode<T> *> nodeQ;
    nodeQ.push(pNode);

    while (!nodeQ.empty()) {
        TreeNode<T> *front = nodeQ.front();
        nodeQ.pop();
        visit(front);

        if (front->left) {
            nodeQ.push(front->left);
        }
        if (front->right) {
            nodeQ.push(front->right);
        }
    }
}

extern "C" JNIEXPORT jstring JNICALL
Java_com_lql_dn_ndk_ndk_1day42_MainActivity_stringFromJNI(
        JNIEnv *env,
        jobject /* this */) {

    TreeNode<char> *A = new TreeNode<char>('A');
    TreeNode<char> *B = new TreeNode<char>('B');
    TreeNode<char> *C = new TreeNode<char>('C');
    TreeNode<char> *D = new TreeNode<char>('D');
    TreeNode<char> *E = new TreeNode<char>('E');
    TreeNode<char> *F = new TreeNode<char>('F');
    
    A->left = B;
    A->right = C;
    
    B->left = D;
    B->right = E;
    
    C->right = F;
    
    LOGE("=========前序遍历=========");
    preOrderTraverse(A, doPre);
    LOGE("=========中序遍历=========");
    inorderTraverse(A, doPre);
    LOGE("=========后序遍历=========");
    postOrderTraverse(A, doPre);
    LOGE("=========层序遍历=========");
    levelOrderTraverse(A, doPre);

    LOGE("=========树的深度=========");
    int treeDepth = getDepthTree(A); // 参考:二、获取树的深度
    LOGE("%d", treeDepth);

    LOGE("=========是否为平衡二叉树=========");
    bool balanceTree  = isBalanceTree(A); // 参考:三、是否为平衡二叉树
    LOGE("%d", balanceTree);
    
    std::string hello = "Hello from C++";
    return env->NewStringUTF(hello.c_str());
}

运行一下,打印结果
前序、中序、后序、层序打印结果

二、获取树的深度

/**
 * 树的深度
 * @tparam T 泛型类型
 * @param pNode 头节点
 * @return 树的深度
 */
template <class T>
int getDepthTree(TreeNode<T> *pNode) {
    if (pNode == NULL) {
        return 0;
    }

    int leftDepth = getDepthTree(pNode->left);
    int rightDepth = getDepthTree(pNode->right);
    return max(leftDepth, rightDepth) + 1; // 之所以加 1,是因为如果只有双亲节点,那么左右节点深度为 0,此时树深为双亲节点自身深度 1
}

三、是否为平衡二叉树

/**
 * 是否为平衡二叉树
 * @tparam T 泛型类型
 * @param pNode 头节点
 * @return true:是;false:否
 */
template <class T>
bool isBalanceTree(TreeNode<T> *pNode) {
    if (pNode == NULL) {
        return true;
    }

    int leftDepth = getDepthTree(pNode->left);
    int rightDepth = getDepthTree(pNode->right);

    return abs(leftDepth - rightDepth) <= 1 && isBalanceTree(pNode->left) && isBalanceTree(pNode->right);
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值