C++实现二叉树相关问题(先序遍历,中序遍历,后序遍历,层序遍历,搜索二叉树、平衡二叉树、满二叉树、完全二叉树的判断,最低公共祖先,二叉树的序列化和反序列化)
目录
题目一 二叉树递归和非递归遍历
题目二 如何完成二叉树的宽度(也叫层序)遍历(常见题目:求一棵二叉树的宽度)
题目四 如何判断一棵二叉树是搜索二叉树(BST)?
题目四 如何判断一棵二叉树是平衡二叉树(AVL)?
题目五 如何判断一棵二叉树是满二叉树(FBT)?
题目六 如何判断一棵二叉树是完全二叉树(CBT)?
题目七 给定两个二叉树的节点node1和node2,找到他们的最低公共祖先节点
题目八 在二叉树中找到一个节点的后继节点。
题目十 折纸问题
关于二叉树的一些笔记。
题目一 二叉树递归和非递归遍历
递归序
void RecurTree(Node *head){if (head == nullptr){return;}preOrderRecur(head -> left);preOrderRecur(head -> right);
}
递归序定义:上面的递归代码运行时,如果什么都不做,每个节点被访问的顺序。
以上二叉树的递归序为:1, 2, 4, 4, 4, 2, 5, 5, 5, 2, 1, 3, 6, 6, 6, 3, 7, 7, 7, 3, 1
基于递归序,对二叉树的遍历分为先序遍历,中序遍历和后续遍历。
先序遍历:1, 2, 4, 5, 3, 6, 7(选取第一次出现的节点值,即第一次到达节点的时候打印,二、三次到达节点时什么也不做。)
中序遍历:4, 2, 5, 1, 6, 3, 7(选取第二次出现的节点值,即第二次到达节点的时候打印,一、三次到达节点时什么也不做。)
后序遍历:4, 5, 2, 6, 7, 3, 1(选取第三次出现的节点值,即第三次到达节点的时候打印,一、二次到达节点时什么也不做。)
以下为先序遍历、中序遍历和后序遍历的非递归实现原理。方法:借助栈。
先序遍历:
① 把头节点压入栈中;
② 从栈中弹出一个节点cur;
③ 打印(处理)cur;
④ 先后压右、左节点入栈(如果有的话);
⑤ 重复② - ④步。
中序遍历:
① 每棵子树,整棵树左边界进栈;
② 依次弹出节点的过程中打印,然后对弹出节点的右树重复以上过程;
中序遍历能使用上面方法遍历的原因,任何一棵树都可以被左边界分解掉。
后序遍历:一个栈和一个收集栈
① 把头节点压入栈中;
② 从栈中弹出一个节点cur;
③ cur压入收集栈;
④ 先后压左、右节点入栈(如果有的话);
⑤ 重复② - ④步;
⑥ 打印收集栈。
具体代码如下:
#include <iostream>
#include <stack>
using namespace std;struct Node{int val;Node *left;Node *right;Node() : val(0), left(nullptr), right(nullptr) {}Node(int x) : val(x), left(nullptr), right(nullptr) {}
};//递归
//先序遍历
void preOrderRecur(Node *head){if (head == nullptr){return;}cout << head -> val << " ";preOrderRecur(head -> left);preOrderRecur(head -> right);
}
//中序遍历
void inOrderRecur(Node *head){if (head == nullptr){return;}inOrderRecur(head -> left);cout << head -> val << " ";inOrderRecur(head -> right);
}
//后序遍历
void posOrderRecur(Node *head){if (head == nullptr){return;}posOrderRecur(head -> left);posOrderRecur(head -> right);cout << head -> val << " ";
}//非递归,借助栈
//先序遍历
void preOrderUnRecur(Node *head){if (head != nullptr){stack<Node*> helper;helper.push(head);while(!helper.empty()){head = helper.top();cout << head -> val << " ";helper.pop();if (head -> right != nullptr){helper.push(head -> right);}if (head -> left != nullptr){helper.push(head -> left);}}}}//中序遍历
void inOrderUnRecur(Node *head){if (head != nullptr){stack<Node*> helper;while(!helper.empty() || head != nullptr){if (head != nullptr){helper.push(head);head = head -> left;}else {head = helper.top();cout << head -> val << " ";helper.pop();head = head -> right;} }}
}//后序遍历
void posOrderUnRecur(Node *head){if (head != nullptr){stack<Node*> helper1;stack<Node*> helper2;helper1.push(head);while(!helper1.empty()){head = helper1.top();helper2.push(head);helper1.pop();if (head -> left != nullptr){helper1.push(head -> left);}if (head -> right != nullptr){helper1.push(head -> right);}}while (!helper2.empty()){cout << helper2.top() -> val << " ";helper2.pop();}}
}int main(){Node *head = new Node(5);head -> left = new Node(3);head -> right = new Node(8);head -> left -> left = new Node(2);head -> left -> right = new Node(4);head -> left -> left -> left = new Node(1);head -> right -> left = new Node(5);head -> right -> right = new Node(9);head -> right -> right -> right = new Node(7);preOrderRecur(head);cout << endl;preOrderUnRecur(head);cout << endl;inOrderRecur(head);cout << endl;inOrderUnRecur(head);cout << endl;posOrderRecur(head);cout << endl;posOrderUnRecur(head);cout << endl;system("pause");
}
题目二 如何完成二叉树的宽度(也叫层序)遍历(常见题目:求一棵二叉树的宽度)
层序遍历借助队列,头部进,尾部出。
① 先把头节点放入队列;
② 然后弹出就打印;
③ 弹出时先后放入该节点的左、右节点。
④ 循环② -> ③
代码如下:
#include <iostream>
#include <queue>
using namespace std;struct Node{int val;Node *left;Node *right;Node() : val(0), left(nullptr), right(nullptr) {}Node(int x) : val(x), left(nullptr), right(nullptr) {}
};void levelTraversal(Node *head){if (head != nullptr){priority_queue<Node*> helper;helper.push(head);while(!helper.empty()){head = helper.top();cout << head -> val << " ";helper.pop();if (head -> left != nullptr){helper.push(head -> left);}if (head -> right != nullptr){helper.push(head -> right); }} }
}int main(){Node *head = new Node(5);head -> left = new Node(3);head -> right = new Node(8);head -> left -> left = new Node(2);head -> left -> right = new Node(4);head -> right -> left = new Node(5);head -> right -> right = new Node(9);levelTraversal(head);cout << endl;system("pause");
}
现在来看求二叉树的宽度
借助哈希表,记录每个节点所在的层数,然后统计层数最大的,代码如下:
#include <iostream>
#include <map>
#include <queue>
#include <algorithm>
using namespace std;struct Node{int val;Node *left;Node *right;Node() : val(0), left(nullptr), right(nullptr) {}Node(int x) : val(x), left(nullptr), right(nullptr) {}
};int getMaxwidth(Node *head){if (head == nullptr){return 0;}int maxWidth = 0;int curWidth = 0;int curLevel = 0;//记录每个节点对应层数的哈希表map<Node*, int> levelMap;levelMap.insert({head, 1});//借助队列实现层序遍历queue<Node*> helper;helper.push(head);while (!helper.empty()){head = helper.front();helper.pop();if (head -> left != nullptr){helper.push(head -> left);levelMap.insert({head -> left, levelMap[head] + 1});}if (head -> right != nullptr){helper.push(head -> right);levelMap.insert({head -> right, levelMap[head] + 1}); }if (levelMap[head] > curLevel){curWidth = 1;curLevel = levelMap[head];}else {curWidth++;}maxWidth = max(maxWidth, curWidth);}return maxWidth;
}int main(){Node *head = new Node(5);head -> left = new Node(3);head -> right = new Node(8);head -> left -> left = new Node(2);head -> left -> right = new Node(4);head -> left -> left -> left = new Node(1);head -> left -> left -> right = new Node(1);head -> left -> right -> left = new Node(4);head -> left -> right -> right = new Node(4);head -> right -> left = new Node(5);head -> right -> right = new Node(9);head -> right -> right -> right = new Node(7);int max = getMaxwidth(head);cout << max << endl;system("pause");
}
题目四 如何判断一棵二叉树是搜索二叉树(BST)?
搜索二叉树定义:如果一棵树不为空,并且如果它的根节点左子树不为空,那么它左子树上面的所有节点的值都小于它的根节点的值,如果它的右子树不为空,那么它右子树任意节点的值都大于他的根节点的值,它的左右子树也是搜索二叉树。
解法一:中序遍历后是升序的就是搜索二叉树,将中序遍历的值存入到队列中,在判断是不是升序。对应代码中的方法1;
解法二:使用递归:
① 左子树是搜索二叉树;
② 左子树是搜索二叉树;
③ 左树max < x;
④ 右树min > x;
左树需要的信息:是不是搜索二叉树?max值?
右树需要的信息:是不是搜索二叉树?min值?
左右树均需返回的信息:是不是搜索二叉树?max值?min值?
对应代码中的方法2。
#include <iostream>
#include <vector>
using namespace std;struct Node{int val;Node *left;Node *right;Node() : val(0), left(nullptr), right(nullptr) {}Node(int x) : val(x), left(nullptr), right(nullptr) {}
};//中序遍历
void inOrderTravesal(Node *root, vector<Node*> &helper){if (root == nullptr){return;}inOrderTravesal(root -> left, helper);helper.insert(helper.end(), root);inOrderTravesal(root -> right, helper);
}bool isBST(Node *root){if (root == nullptr){return true;}vector<Node*> helper;inOrderTravesal(root, helper);int pre = INT_MIN;for (auto c : helper){if (pre >= c -> val){return false;}pre = c -> val;}return true;
}int preValue = INT_MIN;bool isBST2(Node *root){if (root == nullptr){return true;}bool isLeftBST = isBST2(root -> left);if (!isLeftBST){return false;}if (root -> val <= preValue){return false;}else {preValue = root -> val;}return isBST2(root -> right);
}int main(){Node *root = new Node(6);root -> left = new Node(4);root -> right = new Node(9);root -> left -> left = new Node(3);root -> left -> right = new Node(5);root -> right -> left = new Node(8);root -> right -> right = new Node(10);cout << boolalpha << isBST(root) << endl;cout << boolalpha << isBST2(root) << endl;system("pause");
}
树型DP代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;struct Node{int val;Node *left;Node *right;Node() : val(0), left(nullptr), right(nullptr) {}Node(int x) : val(x), left(nullptr), right(nullptr) {}
};//需要知道左右子树是不是BST,左右子树的最大,最小值
struct ReturnData{bool isBST;int min;int max;ReturnData(bool is, int mi, int ma) : isBST(is), min(mi), max(ma) {}
};ReturnData* process(Node *x){if (x == nullptr){return nullptr;}ReturnData *leftData = process(x -> left);ReturnData *rightData = process(x -> right);int minData = x -> val;int maxData = x -> val;if (leftData != nullptr){minData = min(minData, leftData -> min);maxData = max(maxData, leftData -> max);}if (rightData != nullptr){minData = min(minData, rightData -> min);maxData = max(maxData, rightData -> max);}bool isBST = true;if (leftData != nullptr && (!leftData -> isBST || leftData -> max >= x -> val)){isBST = false;}if (rightData != nullptr && (!rightData -> isBST || rightData -> min <= x -> val)){isBST = false;}return new ReturnData(isBST, minData, maxData);
}int main(){Node *root = new Node(6);root -> left = new Node(4);root -> right = new Node(9);root -> left -> left = new Node(3);root -> left -> right = new Node(5);root -> right -> left = new Node(8);root -> right -> right = new Node(10);cout << boolalpha << process(root) -> isBST << endl;cout << process(root) -> min << endl;cout << process(root) -> max << endl;system("pause");
}
题目四 如何判断一棵二叉树是平衡二叉树(AVL)?
首先了解一下平衡二叉树的定义:平衡二叉树(AVL树),它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
套用树型DP模板,需要知道的信息为:
① 左树是平衡二叉树;
② 右树是平衡二叉树;
③ 丨左高 - 右高丨 1
左树需要的信息:是不是平衡二叉树?高度?
右树需要的信息:是不是平衡二叉树?高度?
代码如下:
#include <iostream>
#include <algorithm>
using namespace std;struct Node{int val;Node *left;Node *right;Node() : val(0), left(nullptr), right(nullptr) {}Node(int x) : val(x), left(nullptr), right(nullptr) {}
};struct ReturnData{bool isAVL;int height;ReturnData(bool is, int h) : isAVL(is), height(h){}
};ReturnData* process(Node *root){if (root == nullptr){return new ReturnData(true, 0);}ReturnData *leftData = process(root -> left);ReturnData *rightData = process(root -> right);int height = max(leftData -> height, rightData -> height) + 1;bool isAVL = leftData -> isAVL && rightData -> isAVL && abs(leftData -> height - rightData -> height) < 2;return new ReturnData(isAVL, height);
}bool isAVL(Node *root){return process(root) -> isAVL;
}int main(){Node *root = new Node(6);root -> left = new Node(4);root -> right = new Node(9);root -> left -> left = new Node(3);root -> left -> right = new Node(5);// root -> right -> left = new Node(8);// root -> right -> right = new Node(10);cout << boolalpha << isAVL(root) << endl;system("pause");
}
题目五 如何判断一棵二叉树是满二叉树(FBT)?
满二叉树定义:树中除了叶子节点,每个节点都有两个子节点。
解题方法: 先统计这棵树的最大深度L,然后统计这棵树的节点个数N。若是满二叉树需满足关系。
① 左树是满二叉树;
② 右树是满二叉树;
③ 左树的信息:是不是满二叉树?深度?节点数?
④ 右树的信息:是不是满二叉树?深度?节点数?
#include <iostream>
#include <algorithm>
using namespace std;struct Node{int val;Node *left;Node *right;Node() : val(0), left(nullptr), right(nullptr) {}Node(int x) : val(x), left(nullptr), right(nullptr) {}
};struct ReturnData{int deep;int nodes;ReturnData(int d, int n) : deep(d), nodes(n) {}
};ReturnData* process(Node *root){if (root == nullptr){return new ReturnData(0, 0);}ReturnData *leftData = process(root -> left);ReturnData *rightData = process(root -> right);int dee = max(leftData -> deep, rightData -> deep) + 1;int nod = leftData -> nodes + rightData -> nodes + 1;return new ReturnData(dee, nod);
}bool isCBT(Node *root){ReturnData *data = process(root); return data -> nodes == (1 << data -> deep) - 1;
}int main(){Node *root = new Node(6);root -> left = new Node(4);root -> right = new Node(9);root -> left -> left = new Node(3);root -> left -> right = new Node(5);root -> right -> left = new Node(8);// root -> right -> right = new Node(10);cout << boolalpha << isCBT(root) << endl;system("pause");
}
题目六 如何判断一棵二叉树是完全二叉树(CBT)?
完全二叉树定义:一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。
解决:二叉树层序遍历
① 遇到的任何一个节点有右节点没有左节点,直接返回false;
② 在①不违规的条件下,如果遇到第一个左右节点不双全的节点,后续节点必须是都是叶节点,则为完全二叉树,否则该二叉树不是完全二叉树。
#include <iostream>
#include <queue>
using namespace std;struct Node{int val;Node *left;Node *right;Node() : val(0), left(nullptr), right(nullptr) {}Node(int x) : val(x), left(nullptr), right(nullptr) {}
};bool isCBT(Node *root){if (root == nullptr){return true;}queue<Node*> helper;bool leafNotFull = false;//是否遇到子节点不双全的情况,是为true,不是为falsehelper.push(root);while(!helper.empty()){Node *cur = helper.front();helper.pop();Node *l = cur -> left;Node *r = cur -> right;//有右节点,无左节点 => false;遇到了不双全的节点之后,又发现当前节点不是叶节点 => falseif ((l == nullptr && r != nullptr) ||(leafNotFull && (l != nullptr || r != nullptr))){return false; }if (l != nullptr){helper.push(l);}if (r != nullptr){helper.push(r);}else {leafNotFull = true;} }return true;
}int main(){Node *root = new Node(6);root -> left = new Node(4);root -> right = new Node(9);//root -> left -> left = new Node(3);//root -> left -> right = new Node(5);root -> right -> left = new Node(8);root -> right -> right = new Node(10);cout << boolalpha << isCBT(root) << endl;system("pause");
}
题目七 给定两个二叉树的节点node1和node2,找到他们的最低公共祖先节点
方法一:借助哈希表。
① 在哈希表中存储每个节点和节点的父节点;
② 查找node1节点的所有父节点,存储在set结构的set1中;
③ 依次查找node2节点的父节点并判断查找到的节点是否在set1中,若存在,当前节点为最低公共祖先,不存在返回根节点。
如代码中方法1所示。
方法2: 递归
o1和o2的关系只有下面两类:
① o1是o2的LCA,或者o2是o1的LCA;
② o1与o2不互为LCA,向上遍历树找到;
如代码中方法2所示。
#include <iostream>
#include <map>
#include <set>
using namespace std;struct Node{int val;Node *left;Node *right;Node() : val(0), left(nullptr), right(nullptr) {}Node(int x) : val(x), left(nullptr), right(nullptr) {}
};void process(Node *root, map<Node*, Node*> &fatherMap){if (root == nullptr){return;}fatherMap.insert({root -> left, root});fatherMap.insert({root -> right, root});process(root -> left, fatherMap);process(root -> right, fatherMap);
}//方法1
Node* lowestCommonAncestor1(Node *root, Node *o1, Node *o2){map<Node*, Node*> fatherMap;fatherMap.insert({root, root});process(root, fatherMap);set<Node*> set1;Node *cur = o1;while (cur != fatherMap[cur]){set1.insert(cur);cur = fatherMap[cur];}set1.insert(root);cur = o2;while(cur != fatherMap[cur]){if (set1.count(cur)){return cur;}cur = fatherMap[cur];}return root;
}//方法2
Node* lowestCommonAncestor2(Node *root, Node *o1, Node *o2){if (root == nullptr || root == o1 || root == o2){return root;}Node *left = lowestCommonAncestor2(root -> left, o1, o2);Node *right = lowestCommonAncestor2(root -> right, o1, o2);if (left != nullptr && right != nullptr){return root;}//左右两棵树,并不都有返回值,谁不空返回谁return left != nullptr? left : right;
}//test
int main(){Node *root = new Node(6);root -> left = new Node(4);root -> right = new Node(9);root -> left -> left = new Node(3);root -> left -> right = new Node(5);root -> right -> left = new Node(8);root -> right -> right = new Node(10);Node *o1 = root -> left -> left;Node *o2 = root -> left -> right;cout << o1 -> val << ", " << o2 -> val <<": " << endl;cout << lowestCommonAncestor1(root, o1, o2) -> val << endl;cout << lowestCommonAncestor2(root, o1, o2) -> val << endl;system("pause");
}
题目八 在二叉树中找到一个节点的后继节点。
后继节点的定义: 在二叉树的中序遍历序列中,node的下一个节点叫做node的后继节点。
分以下几种情况:
① x有右树的时候:后继节点为右树上的最左节点;
② x无右树的时候:依次向上遍历父节点,直到找到的父节点是其父节点y的左节点,因为这时x是y左树上最后一个打印的节点,下一个必定打印y;
③ x为整棵树最右的节点,此时x的后继节点为nullptr。
代码如下:
#include <iostream>
using namespace std;struct Node{int val;Node *left;Node *right;Node *parent;Node(int x) : val(x), left(nullptr), right(nullptr), parent(nullptr) {}
};
//获取node节点的最左节点
Node* getMostLeft(Node * node){if (node == nullptr){return node;}Node *cur = nullptr;while (node != nullptr){cur = node;node = node -> left;}return cur;
}Node* getSuccessorNode(Node* node){if (node == nullptr){return node;}if (node -> right != nullptr){return getMostLeft(node -> right);}else {Node *nodeParent = node -> parent;while(nodeParent != nullptr && nodeParent -> left != node){node = nodeParent;nodeParent = node -> parent;}return nodeParent;}return nullptr;
}
//test
int main(){Node *root = new Node(1);root -> parent = nullptr;root -> left = new Node(2);root -> left -> parent = root;root -> right = new Node(3);root -> right -> parent = root;root -> right -> left = new Node(6);root -> right -> left -> parent = root -> right;root -> right -> right = new Node(7);root -> right -> right -> parent = root -> right;cout << getSuccessorNode(root) -> val << endl;system("pause");
}
题目九 二叉树的序列化和反序列化
使用先序遍历序列化和反序列化的代码如下:
#include <iostream>
#include <string>
#include <sstream>
using namespace std;struct Node{int val;Node *left;Node *right;Node(int x) : val(x), left(nullptr), right(nullptr) {}
};string serializeByPre(Node *root){if (root == nullptr){return "# ";}string res = to_string(root -> val) + " ";res += serializeByPre(root -> left);res += serializeByPre(root -> right);return res;
}Node* myDeserialize(istringstream &ans){string tmp;ans >> tmp;if (tmp == "#"){return nullptr; }Node *root = new Node(stoi(tmp));root -> left = myDeserialize(ans);root -> right = myDeserialize(ans);return root;
}Node* deserialize(string preStr){istringstream tmp(preStr);return myDeserialize(tmp);
}
题目十 折纸问题
解题思路:每折一次都会在上一次的折痕两边添加两道新的折痕,上边的折痕为凹(down)折痕,下边的折痕为凸(up)折痕。因此基于中序遍历即可解决问题。
代码如下:
#include <iostream>
#include <string>
using namespace std;//递归过程,来到了某一个节点
//i是当前节点的层数,N一共的层数,down == true ==> 凹折痕, down == false ==> 凸折痕
void printProcess(int i, int N, bool down){if (i > N){return;}printProcess(i + 1, N, true);string fold = down ? "down" : "up";cout << fold <<" ";printProcess(i + 1, N, false);
}void printAllFolds(int N){printProcess(1, N, true);
}int main(){cout << "Please Enter N: ";int N;cin >> N;printAllFolds(N);cout << endl;system("pause");
}
C++实现二叉树相关问题(先序遍历,中序遍历,后序遍历,层序遍历,搜索二叉树、平衡二叉树、满二叉树、完全二叉树的判断,最低公共祖先,二叉树的序列化和反序列化)相关推荐
- 二叉树前序中序后序_leetcode889_go_根据前序和后序遍历构造二叉树
leetcode889_根据前序和后序遍历构造二叉树 01 - 题目 返回与给定的前序和后序遍历匹配的任何二叉树. pre 和 post 遍历中的值是不同的正整数. 示例:输入:pre = [1,2, ...
- 已知二叉树先序和中序遍历结果,求后序遍历结果
以下面的例题为例进行讲解:已知一棵二叉树的先序遍历序列和中序遍历序列分别是ABDCEF.BDAECF,求二叉树及后序遍历序列. 分析:先序遍历序列的第一个字符为根结点.对于中序遍历,根结点在中序遍历序 ...
- 二叉树前序遍历python输出_[宜配屋]听图阁 - Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例...
本文实例讲述了Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作.分享给大家供大家参考,具体如下: 实现一个功能: 输入:一颗二叉树的先序和中序遍历 输出:后续遍历 思想: 先序遍历中,第 ...
- 为什么普通树没有中序遍历和森林没有后序遍历
本文为个人理解,若有错误欢迎指正! 这里说的树当然是指普通的树,而不是树中比较特别的二叉树. 1.为什么普通树没有中序遍历 中序遍历是对于二叉树而言: 中序遍历左子树,访问根结点,中序遍历右结点. 在 ...
- 二叉树(二):判断是不是二叉搜索树、判断是不是完全二叉树、判断是不是平衡二叉树、二叉搜索树的最近公共祖先、在二叉搜索树中找到两个节点的最近公共祖先、序列化二叉树、重建二叉树、输出二叉树的右视图
目录 一.判断是不是二叉搜索树 1.1 题目 1.2 题解 二.判断是不是完全二叉树 2.1 题目 2.2 题解 三.判断是不是平衡二叉树 3.1 题目 3.2 题解 四.二叉搜索树的最近公共祖先 4 ...
- 由浅入深:求给定两个树节点的最低公共祖先(二叉树、普通树结构)JAVA实现
最近看了一道面试题目,觉得很有意思,而且常常被问到,今天综合归纳了一下这道题目,并给出了各种变形题目,附上JAVA版的程序解答. 题目是这样的:寻找二叉树的最低公共祖先?(其中隐含着一个盲点:树是什么 ...
- C语言二叉树的lowest common ancestor最低公共祖先(附完整源码)
C语言二叉树的lowest common ancestor最低公共祖先 C语言二叉树的lowest common ancestor最低公共祖先完整源码(定义,实现,main函数测试) C语言二叉树的l ...
- 给定二叉树先序、中序遍历序列,求后序遍历
给定一个二叉树的前序遍历和中序遍历的序列,输出对应这个二叉树的后续遍历序列. 输入描述: 输入为一行. 两个字符串,分别表示二叉树的前序遍历和中序遍历结果,用空格分隔.保证数据合法 输出描述: 对应输 ...
- 二叉树前序中序后续线索树_后序线索二叉树怎么画 线索二叉树基本操作详解 - 办公软件 - 服务器之家...
后序线索二叉树怎么画 线索二叉树基本操作详解 发布时间:2017-05-23 来源:服务器之家 遍历二叉树是以一定规则将二叉树中结点排列成一个线性序列,得到二叉树中结点的先序,中序或后序序列.这实际上 ...
最新文章
- tf.keras.losses.MeanSquaredLogarithmicError 损失函数 的用法
- Docker无法连接到docker守护程序
- 《python核心编程》读书笔记--第15章 正则表达式
- 数据结构与算法 | 队列
- “鹅厂养鹅”是假的,但腾讯这个“山洞”是真的
- 北漂、海漂的你,每个月发薪资支付生活成本后还剩多少钱
- [转载] 算法竞赛中的JAVA使用笔记
- Python之smtpd及smtplib(邮件服务器及客户端)
- 对虚拟目录的操作(转)
- 集成学习(一)——随机森林以及GBDT
- 部署SpringBoot到阿里云
- AcWing 285. 没有上司的舞会(树形DP)
- 修改sql数据库服务器名称,如何更改sql数据库服务器名称
- 74xx系列芯片说明
- 微信公众号迁移公证需要哪些材料?账号迁移流程来了
- day1.数据库初步了解
- python面试题(面试重点)
- 计算机桌面下面那一栏如何调节,电脑底部的任务栏不见了,你可以尝试这样做,轻松恢复它...
- 天津大学校园网环境下访问IEEE网址出现tianjin university账号没有登录的问题
- golang工作中常用的一些库
热门文章
- 兰州银行在深交所挂牌:2022年首个上市银行股,业绩相对稳定
- vue使用element-ui或者element-plus固定 el-header 和 el-aside
- C# winform 让ComboBox控件的文本居中方法
- Python 打印杨辉三角形(包括金字塔的款式的~~)
- 如何制定月工作计划?——我的项目管理心得
- 廉航特价信息快速获取指南
- mysql删除数据后释放磁盘空间
- Photoshop最常见的问答集
- 【jiasuba】教你正确启用BIOS显卡 预防电脑黑屏困扰
- java web网站 js 简体繁体切换_求繁简转换的js代码,可以设置打开网站时候整站默认显示繁体或简体,然后可以手动切换繁简。...