//3.10_tree.cpp by flyinghearts#qq.com //3.8_求二叉树中节点的最大距离 和 3.10_分层遍历二叉树 测试例子 #include<iostream> #include<vector> #include<deque> #include<cassert> using namespace std; struct Node { Node *left; Node *right; int data; }; struct Node_tree { size_t index; size_t left; //如果left或right的值为0则表示空节点 size_t right; int data; }; static int tree_height(Node* root, int& max_d) { //每碰到一个子节点,高度自增1,可以设空节点高度为-1, //避免计算高度时对空节点的判断。 if (root==NULL) return -1; int a = tree_height(root->left, max_d) + 1; int b = tree_height(root->right, max_d) + 1; int c = a+b; if (max_d < c) max_d = c; return a>b ? a : b; } int tree_diameter(Node* root) { int max_d=0; tree_height(root, max_d); return max_d; } void build_tree(deque<Node> &node, Node_tree node_tree[], size_t sz, bool rebuild=1, size_t extra=0) { if (sz<1 ||(node_tree==NULL)) return; Node_tree *tree=&node_tree[0]; if (extra) node.resize(extra+node.size()); else if (rebuild) node.resize(sz); size_t index=0,i=0, size=node.size(); for (; i<sz; ++i,++tree) { index=tree->index; assert(index<size); assert(tree->left<size); assert(tree->right<size); node[index].data=tree->data; if (tree->left) node[index].left=&node[tree->left]; else node[index].left=NULL; if (tree->right) node[index].right=&node[tree->right]; else node[index].right=NULL; } } void print_tree_bfs_v(Node* root) { if (root==NULL) return; vector<Node*> tree; Node *node=root; tree.push_back(root); size_t idx=0, last=0; while (1){ if (node->left) tree.push_back(node->left); if (node->right) tree.push_back(node->right); if (idx!=last){ cout << node->data << "-"; }else{ cout<< node->data << "/n"; if (last==tree.size()-1) break; last=tree.size()-1; } node=tree[++idx]; } cout<< "/n"; } void print_tree_bfs_d(Node* root) { if (root==NULL) return; deque<Node*> tree; tree.push_back(root); deque<Node*>::iterator low=tree.begin(),last=tree.begin(); Node *node=root; while (1){ if (node->left) tree.push_back(node->left); if (node->right) tree.push_back(node->right); if (low!=last){ cout << node->data << "-"; }else{ cout<< node->data << "/n"; if (last==tree.end()-1) break; last=tree.end()-1; } node=*++low; } cout<< "/n"; } void print_tree_bfs_d2(Node* root) { if (root==NULL) return; deque<Node*> tree; tree.push_back(root); deque<Node*>::iterator low=tree.begin(); Node *node=root, *last=root; while (1){ if (node->left) tree.push_back(node->left); if (node->right) tree.push_back(node->right); if (node!=last){ cout << node->data << "-"; }else{ cout<< node->data << "/n"; if (last==tree.back()) break; last=tree.back(); //这可以保证队列内至少有两个元素。 } tree.pop_front(); node=tree.front(); } cout<< "/n"; } void print_tree_bfs_d3(Node* root) { if (root==NULL) return; deque<Node*> tree; tree.push_back(root); deque<Node*>::iterator low=tree.begin(); Node *node=root, *last=root; while (1){ node=tree.front(); tree.pop_front(); if (node->left) tree.push_back(node->left); if (node->right) tree.push_back(node->right); if (node!=last){ cout << node->data << "-"; }else{ cout<< node->data << "/n"; if (tree.empty()) break; last=tree.back(); } } cout<< "/n"; } void print_tree_bfs_level(Node* root, size_t level) { deque<Node*> tree; tree.push_back(root); Node *node=root, *last=root; while (1) { node=tree.front(); tree.pop_front(); if (node->left) tree.push_back(node->left); if (node->right) tree.push_back(node->right); if (node!=last){ if (level==0) cout << node->data << "-"; }else{ if (level==0) { cout<< node->data << "/n"; break; } if (tree.empty()) break; last=tree.back(); --level; } } } template<typename T, size_t sz> inline size_t getsz(T (&arr)[sz]) { return sz;} int main() { deque<Node> qnode; Node_tree node_tree[]={ //树结构见 P249 图3-17 {0,1,2, 1}, {1,3,4, 2}, {2,0,5, 3}, {3,0,0, 4}, {4,6,7, 5}, {5,0,0, 6}, {6,0,0, 7}, {7,0,0, 8}, }; size_t sz_a=getsz(node_tree); build_tree(qnode,node_tree,sz_a); print_tree_bfs_v(&qnode[0]); print_tree_bfs_d(&qnode[0]); print_tree_bfs_d2(&qnode[0]); print_tree_bfs_d3(&qnode[0]); print_tree_bfs_level(&qnode[0],2); print_tree_bfs_level(&qnode[0],4); print_tree_bfs_level(&qnode[0],3); Node_tree tree_aa[1]={{0,0,0,0}}; //只有一个根节点 build_tree(qnode,tree_aa,1); print_tree_bfs_d2(&qnode[0]); print_tree_bfs_d3(&qnode[0]); cout<< "/n/ntree_diameter test:/n"; Node_tree tree_b[]={ //树结构见 P239 图3-12 右图 {0,1,0, 0}, {1,2,3, 1}, {2,4,0, 2}, {3,5,6, 3}, {4,7,0, 4}, {5,0,8, 5}, {6,0,0, 6}, {7,0,0, 7}, {8,0,0, 8}, }; Node_tree tree_c[]={ //树结构见 P239 图3-13 {0,1,2, 0}, {1,3,4, 1}, {2,5,6, 2}, {3,7,0, 3}, {4,0,0, 4}, {5,0,8, 5}, {6,0,0, 6}, {7,0,0, 7}, {8,0,0, 8}, }; size_t sz_b=getsz(tree_b); size_t sz_c=getsz(tree_c); build_tree(qnode,tree_b,sz_b); print_tree_bfs_d3(&qnode[0]); cout<< "diameter: "<< tree_diameter(&qnode[0])<< "/n/n"; build_tree(qnode,tree_c,sz_c); print_tree_bfs_d3(&qnode[0]); cout<< "diameter: "<< tree_diameter(&qnode[0])<< "/n/n"; }