IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 关于二叉树的一些心得 -> 正文阅读

[数据结构与算法]关于二叉树的一些心得

#include
#include
#include
#include

using namespace std;

typedef struct bitnode
{

int val;
struct bitnode* lchild, * rchild;

}bitnode,*bitree;

struct ReturnTypeOne
{

bool isBST;
int _min;
int _max;

};

struct ReturnTypeTwo
{

bool isAVL;
int height;
ReturnTypeTwo(bool _isAVL, int _height)
{
    isAVL = _isAVL;
    height = _height;
}

};

int StringToInt(string s)
{

int num = 0;
for (int i = 0; i < s.size(); i++)
{
    num = num * 10 + s[i] - '0';
}
return num;

}

int preValue = INT_MIN;

//构建一颗二叉树
bitree createBitree(int level)
{

string s;
cout << "this is the " << level << "th's bitnode:" << endl;
cin >> s;
if (s == "n") {
	return nullptr;
}
else {
	int x = StringToInt(s);
	
	bitree node = new bitnode;

	node->val = x;
	node->lchild = createBitree(level + 1);
	node->rchild = createBitree(level + 1);
	return node;
}

}

//递归的先序遍历
void preOrder(bitree node)
{
if (!node) return;

cout << node->val << ' ';
preOrder(node->lchild);
preOrder(node->rchild);

}

//非递归的先序遍历
void PreOrder(bitree node)
{

if (!node) return;
bitree stk[30];
int top = -1;
bitree pi = node;

while (pi || top != -1)
{
    if (pi) {
        stk[++top] = pi;
        cout << pi->val << ' ';
        pi = pi->lchild;
    }
    else pi = stk[top--]->rchild;
}

}

//递归的中序遍历
void inOrder(bitree node)
{

if (!node) return;

inOrder(node->lchild);
cout << node->val << ' ';
inOrder(node->rchild);

}

//非递归的中序遍历
void InOrder(bitree node)
{

if (!node) return;
bitree stk[30];
int top = -1;
bitree pi = node;

while (pi || top != -1)
{
    if (pi) {
        stk[++top] = pi;
        pi = pi->lchild;
    }
    else{
        pi = stk[top];
        cout << pi->val << ' ';
        top--;
        pi = pi->rchild;
    }
}

}

//递归的后序遍历
void postOrder(bitree node)
{

if (!node) return;

postOrder(node->lchild);
postOrder(node->rchild);
cout << node->val << ' ';

}

//非递归的后序遍历
void PostOrder(bitree node)
{

if (!node) return;
bitree stk[30];
int top = -1;
bitree pi = node, r = nullptr;

while (pi || top != -1)
{
    if (pi) {
        stk[++top] = pi;
        pi = pi->lchild;
    }
    else {
        pi = stk[top];
        if (!pi->rchild || pi->rchild == r) {
            cout << pi->val << ' ';
            top--;
            r = pi;
            pi = nullptr;
        }
        else {
            pi = pi->rchild;
        }
    }
}

}

//bfs
void bfs(bitree node)
{

if (!node) return;
queue<bitree> que;
que.push(node);

while (!que.empty())
{
    auto pi = que.front();
    if (pi->lchild) que.push(pi->lchild);
    if (pi->rchild) que.push(pi->rchild);
    cout << pi->val << ' ';
    que.pop();
}

}

//判断是否完全二叉树
bool isCBT(bitree node)
{

if (!node) return true;
bool time = false;
queue<bitree> que;
que.push(node);

while (!que.empty())
{
    bitree pi = que.front();
    if ((!pi->lchild && pi->rchild) || (time && (pi->lchild || pi->rchild)))
        return false;
    if (pi->lchild) {
        que.push(pi->lchild);
    }
    if (pi->rchild) {
        que.push(pi->rchild);
    }
    if (!pi->rchild) time = true;
    que.pop();
}

return true;

}

//判断是否满二叉树
bool isFBT(bitree node)
{

if (!node) return true;
queue<bitree> que;
int level = 0, cnt = 0;
que.push(node);

while (!que.empty())
{
    int size = que.size();
    cnt += size;
    while (size--)
    {
        bitree pi = que.front();
        if (pi->lchild) que.push(pi->lchild);
        if (pi->rchild) que.push(pi->rchild);
        que.pop();
    }
    level++;
}
return cnt == (1 << level) - 1;

}

//判断是否二叉排序树,方法一
bool isBST_AccessOne(bitree node)
{

if (!node) return true;
bool left = isBST_AccessOne(node->lchild);
if (!left) return false;
if (node->val <= preValue) return false;
else preValue = node->val;
return isBST_AccessOne(node->rchild);

}

//判断是否二叉排序树,方法二
ReturnTypeOne* isBST_AccessTwo(bitree node)
{

if (!node) return nullptr;
auto left = isBST_AccessTwo(node->lchild);
auto right = isBST_AccessTwo(node->rchild);

ReturnTypeOne* tmp = new ReturnTypeOne;
tmp->_min = node->val, tmp->_max = node->val;
if (left) {
    tmp->_min = min(tmp->_min, left->_min);
    tmp->_max= max(tmp->_max, left->_max);
}
if (right) {
    tmp->_min = min(tmp->_min, right->_min);
    tmp->_max = max(tmp->_max, right->_max);
}
tmp->isBST = true;
if ((left && left->_max >= node->val) || (right && right->_min <= node->val))
    tmp->isBST = false;
return tmp;

}

//判断是否平衡二叉树
ReturnTypeTwo* isAVLTree(bitree node)
{

if (!node) return new ReturnTypeTwo(true,0);

auto left = isAVLTree(node->lchild);
auto right = isAVLTree(node->rchild);

int h = 1;
h += max(left->height, right->height);
bool isAVL = left->isAVL && right->isAVL && (abs(left->height - right->height) < 2);
return new ReturnTypeTwo(isAVL, h);

}

int main()
{

bitree root = createBitree(1);

cout << "PreTraverse: " << endl;
preOrder(root);
cout << endl;
PreOrder(root);
cout << endl;

cout << "intraverse: " << endl;
inOrder(root);
cout << endl;
InOrder(root);
cout << endl;

cout << "posttraverse: " << endl;
postOrder(root);
cout << endl;
PostOrder(root);
cout << endl;

cout << "bfstraverse: " << endl;
bfs(root);
cout << endl;

if (isCBT(root)) {
    cout << "this is a complete binary tree!" << endl;
}
else {
    cout << "this isn't a complete binary tree!" << endl;
}

if (isFBT(root)) {
    cout << "this is a full binary tree!" << endl;
}
else {
    cout << "this isn't a full binary tree!" << endl;
}

if (isBST_AccessOne(root)) {
    cout << "this is a bst !" << endl;
}
else {
    cout << "this isn't a bst !" << endl;
}

if (isBST_AccessTwo(root)->isBST) {
    cout << "this is a bst !" << endl;
}
else {
    cout << "this isn't a bst !" << endl;
}

if (isAVLTree(root)->isAVL) {
    cout << "this is an AVL !" << endl;
}
else {
    cout << "this isn't an AVL !" << endl;
}

return 0;

}

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-12-03 13:17:15  更:2021-12-03 13:19:14 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/10 3:21:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码