二叉树(一)
来源:互联网 发布:SQL是面向问题的语言吗 编辑:程序博客网 时间:2024/04/27 23:02
二叉树
- 二叉树的概念:高度、深度、层次、完全二叉树、满二叉树
- 二叉树的性质:层次与结点的关系
二叉树的遍历:中序遍历、先序遍历、后序遍历、层次遍历、zigzag遍历
递归-中序遍历:时间复杂度和空间复杂度均为O(N)
void inorderTraversal(TreeNode *root, vector<int> &nodes){ if(root==NULL) return; inorderTraversal(root->left,nodes); nodes.push_back(root->val); inorderTraversal(root->right,nodes);}vector<int> inorderTraversal(TreeNode *root){ vector<int> nodes; inorderTraversal(root,nodes); return nodes;}
递归-先序遍历:时间复杂度和空间复杂度均为O(N)
void preorderTraversal(TreeNode *root, vector<int> &nodes){ if(root==NULL) return; nodes.push_back(root->val); inorderTraversal(root->left,nodes); inorderTraversal(root->right,nodes);}vector<int> preorderTraversal(TreeNode *root){ vector<int> nodes; preorderTraversal(root,nodes); return nodes;}
递归-后序遍历:时间复杂度和空间复杂度均为O(N)
void postorderTraversal(TreeNode *root, vector<int> &nodes){ if(root==NULL) return; inorderTraversal(root->left,nodes); inorderTraversal(root->right,nodes); nodes.push_back(root->val);}vector<int> postorderTraversal(TreeNode *root){ vector<int> nodes; postorderTraversal(root,nodes); return nodes;}
递归-层次遍历
void buildOrder(TreeNode *root, vector<vector<int> > &nodes, int depth){ if(root==NULL) return; if(node.size()==depth) nodes.push_back(vector<int> ()); nodes[depth].push_back(root->val); buildOrder(root->left, nodes, depth+1); buildOrder(root->right,nodes, depth+1);}vector<int> levelTraversal(TreeNode *root){ vector<vector<int> > nodes; buildOrder(root,nodes,0); return nodes;}
递归-zigzag遍历
void buildOrder(TreeNode *root, vector<vector<int> > &nodes, int depth){ if(root==NULL) return; if(node.size()==depth) nodes.push_back(vector<int> ()); if(depth%2==0) nodes[depth].push_back(root->val); else nodes[depth].insert(res[depth].begin(),root->val); buildOrder(root->left, nodes, depth+1); buildOrder(root->right,nodes, depth+1);}vector<int> levelTraversal(TreeNode *root){ vector<vector<int> > nodes; buildOrder(root,nodes,0); return nodes;}
迭代-中序遍历:时间复杂度和空间复杂度均为O(N)
vector<int> inorderTraversal(TreeNode *root){ stack<TreeNode*> temp; TreeNode *cur=root; vector<int> res; while(cur || !temp.empty()){ if(cur){ temp.push(cur); cur=cur->left; }else{ cur=temp.top(); temp.pop(); res.push_back(cur->val); cur=cur->right; } } return res;}
迭代-先序遍历:时间复杂度和空间复杂度均为O(N)
vector<int> preorderTraversal(TreeNode *root){ stack<TreeNode*> temp; TreeNode *cur=root; vector<int> res; while(cur||!temp.empty()){ if(cur){ temp.push(cur); res.push_back(cur->val); cur=cur->left; }else{ cur=temp.top(); temp.pop(); cur=cur->right; } } return res;}
迭代-后序遍历:时间复杂度和空间复杂度均为O(N)
vecto<int> postorderTraversal(TreeNode *root){ stack<TreeNode*> temp; TreeNode *cur=root; vector<int> res; while(cur || !temp.empty()){ if(cur){ temp.push(cur); res.insert(res.begin(),cur->val); cur=cur->right; }else{ cur=temp.top(); temp.pop(); cur=cur->left; } } return res;}
迭代-层次遍历
vector<vector<int>> levelTraversal(TreeNode *root){ if(!root) return {}; vector<vector<int> > nodes; vector<int> row; queue<TreeNode*> q; q.push(root); int cnt=1; while(!q.empty()){ if(q.front()->left) q.push(q.front()->left); if(q.front()->right) q.push(q.front()->right); row.push_back(q.front()->val); q.pop(); if(--cnt==0){ nodes.push_back(row); row.clear(); cnt=q.size(); } } return nodes;}
二叉树的计算:最大和最小深度、完全二叉树的结点个数、翻转二叉树
最大深度
int maxDepth(TreeNode* root){ if(!root) return 0; return 1+max(maxDepth(root->left),maxDepth(root->right));}
最小深度
int minDepth(TreeNode* root){ if(!root) return 0; if(!root->left && !root->right) return 1; if(!root->left) return 1+minDepth(root->right); if(!root->right) return 1+minDepth(root->left); return 1+min(minDepth(root->left),minDepth(root->right));}
完全二叉树的结点
int CountCompleteTreeNodes(TreeNode* root){ if(!root) return 0; int lheight=subtreeHeight(root->left); int rheight=subtreeHeight(root->right); if(lheight==rheight) return (1<<lheight)+CountCompleteTreeNodes(root->right); else return (1<<rheight)+CountCompleteTreeNodes(root->left);}int subtreeHeight(TreeNode *root){ if(root==NULL) return 0; return 1+subtreeHeight(root->left);}
翻转二叉树
TreeNode* InvertBinaryTree(TreeNode * root){ if(!root) return root; swap(root->left,root->right); InvertBinaryTree(root->left); InvertBinaryTree(root->right); return root;}
二叉树的判断:等价二叉树、对称树、平衡树
等价二叉树
bool isIdentical(TreeNode* p,TreeNode* q){ if(!p && !q) return true; else if(p && q) return (p->val==q->val) && isIdentical(p->left,q->left) && isIdentical(p->right,q->right); else return false;}
对称树
bool isSymmetrical(TreeNode* root){ if(!root) return true; return judge(root->left,root->right);}bool judge(TreeNode * a, TreeNode *b){ if(!a && !b) return true; if(!a && b || a&&!b) return false; if(a->val!=b->val) return false; return judge(a->left,b->left)&&judge(a->right,b->right);}
平衡二叉树
bool isBalanced(TreeNode* root){ return judgeBalance(root)!=-1;}int judgeBalance(TreeNode * root){ if(!root) return 0; int lheight=judgeBalance(root->left); if(lheight==-1) return -1; int rheight=judgeBalance(root->right); if(rheight==-1) return -1; if(abs(lheight-rheight)>1) return -1; return 1+max(judgeBalance(root->left),judgeBalance(root->right));}
0 0
- 二叉树(一)
- 二叉树(一)
- 二叉树(一)
- 二叉树(一)
- 二叉树(一)
- 树(一)二叉树
- 二叉查找树(一)
- 大话二叉树(一)
- 二叉查找树(一)
- 二叉树构建(一)
- 二叉树重建(一)
- 二叉树学习(一)
- 二叉树详谈(一)
- 二叉树设计(一)
- PHP二叉树(一):二叉搜索树
- 二叉树面试题(一) 重建二叉树
- 树和二叉树(一)
- 数据结构(一):树与二叉树
- Java策略模式(Strategy模式) 之体验
- Unity 手柄/键盘映射
- Android集成微信支付主要步骤和特别需要注意的问题
- 【POI2008】【BZOJ1112】砖块Klo
- java.lang.IllegalArgumentException: Page directive: invalid value for import
- 二叉树(一)
- CAGradientLayer的一些属性解析
- java注解(不是注释)
- 应用程序打包发布工具
- 工厂模式 iOS
- 淘宝网林昊:行走在技术巅峰
- WebRTC 开发学习资料
- 虚拟化的组件的学习
- 使用Qt开发中国象棋(七):网络对战