node* rebuildbtree(int* preorder,int lenth,int* inorder,int start,int end)
if(root->_left)
if(root->_right)
return root;
}
bool hascommonroot(node* roo1, node* roo2)
return result;
}bool tree1hastree2(node* root1, node* root2)
void btreemirror(node* root)
bool isbstreepost(int a, int lengh)
for (int j = i; j < lengh - 1; j++)
bool left = true;
if (i > 0)
left = isbstreepost(a, i);
bool right = true;
if (j < lengh - 1)
right = isbstreepost(a+i, j+lengh-1);
return (left&&right);
}
node* changebtree(node* root)
return head;
}void _changebtree(node* root,node* pre)
size_t depth(node* root)
//優化
size_t depthop(node* root,size_t& lengh)
node* getcommonnode(node* root,int x1,int x2)
btnode* getcommonnode(btnode* root, btnode* x1, btnode* x2)
if (x1inleft && x2inleft)
else
}
第二種方法:
拿上面的圖來說明:
a:思路分析一:
如果我們要求h,和i的最近公共祖先,先判斷a的子樹中是否包含h,i,得到的結果為true。接著繼續判斷b, c的子樹中是否同時包含h,i,得到的結果b是true,c是false,接下來判斷b的子樹,結果e為false,d為true,接下來判斷d的子樹,都為false,所以d就是h,i的最近公共祖先。
這個思路可行,但是有乙個缺點,當我們進行判斷h的時候,從a開始,途徑a-b-d,從b開始的時候,途徑b-d,因此就會重複的進行路徑的遍歷,這塊我們可以進行優化。
思路優化分析:
我們將每次判斷的路徑進行記錄下來,如果遍歷到給定節點的話,就是一條路徑,此時往回返,去尋找另乙個節點的路徑。最後將問題轉化成求兩個鍊錶的公共節點問題,公共的節點就是最近公共祖先。
b: **實現:
//1、得到給定節點的一條路徑
bool getnodepath(btnode* root, btnode* x, stack
& paths)
//2、將棧中的路徑進行出棧,如果兩個節點的路徑出棧的時候,元素相等的話,那麼就是公共祖先
node* getcommonnode(btnode* root, btnode* x1, btnode* x2)
path1.pop();
path2.top();
}return null;
}
第三種方法:
a:說明:
這種方法很巧妙,將二叉樹的遞迴運用到了一種極致。
b:**實現:
node* commitnode(node* root,int x1,int x2)
題目說明:
給定一棵二叉樹和其中的乙個節點,如何找出中序遍歷順序的下乙個節點?樹中還給出乙個指向父節點的指標。
用這張圖來作為說明:
- 1、思路分析
我們首先將出現的情況做以分析:
1)此節點沒有右子樹,下一節點可能是它的父節點。如此處的d
2)此節點有右子樹,下乙個節點可能在它的右子樹中的左節點,如此處的b
3)此節點的下乙個節點可能是向上查詢,根節點,如此處的h
- 2、**實現
node* nextbtreenode(node* root)
next = root;
}else
if (root->_parent !=
null)
next =
parent;
}return next;
}
bool issymmetrical(node* root)
bool _issymmetrical(node* root1, node* root2)
資料結構 二叉樹面試題(1)
pragma once include include include typedef char datatype typedef struct btreenode btreenode btreenode createnode datatype data btreenode createtree d...
資料結構 二叉樹面試題(2)
pragma once include include include typedef struct bstreenode bstreenode bstreenode createnode int data 如果存在,插入失敗返回 1,否則插入成功,返回 0 int insert bstreenod...
資料結構 二叉樹基本操作 二叉樹面試題
二叉樹的基本概念就不多說了 如下 binarytree.c pragma once include include include include typedef char btdatatype typedef struct binarytreenode btnode a是乙個前序遍歷的陣列 二叉樹...